1

dataset.runInTransaction(链接) 的示例中,在 上发生了显式错误处理transaction.get(key,callback)

但是在其他操作上,例如transaction.save(entity)or transaction.delete(key),没有回调,所以真的没有办法处理错误。例如:

dataset.runInTransaction(function(transaction, done) {
  transaction.save({
      key: dataset.key(['Company', 123]),
      data: {}
  });
  transaction.delete(dataset.key(['Company', 456]));
  done();
}, function(err, apiResponse) {});

这是否意味着不需要显式回滚事务?

4

2 回答 2

1

我也试图查找相同的问题,但发现以下问题很有帮助。

请看这里

于 2016-01-24T14:17:27.760 回答
0

gcloud-node我花了很多时间与问题跟踪器的贡献者来回交流:

  1. https://github.com/GoogleCloudPlatform/gcloud-node/issues/1120
  2. https://github.com/GoogleCloudPlatform/gcloud-node/issues/633

基本上所有的编辑都是同时完成的(一旦done()被调用),所以如果有任何失败,整个事务将在那时中止。

令人困惑的是,某些操作transaction.get()确实有回调。基本上,返回的实体的版本需要与or发生transaction.get()之前的版本相匹配(同样,在被调用时发生),如果版本不匹配,则事务将自动中止。.save().delete()done()

如果您的调用中的某些内容与您的代码所期望的不匹配,usingtransaction.rollback()仍然很有帮助。.get()

于 2016-02-11T20:44:54.003 回答