保存或删除时,数据存储区事务是否需要回滚?

时间:2016-01-23 21:50:51

标签: google-cloud-datastore gcloud-node

dataset.runInTransactionlink)的示例中,transaction.get(key,callback)上发生了明确的错误处理。

但是对于其他操作,例如transaction.save(entity)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) {});

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

2 个答案:

答案 0 :(得分:1)

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

Please have a look here

答案 1 :(得分:0)

我在问题跟踪器上与gcloud-node个贡献者进行了大量的反复讨论:

  1. https://github.com/GoogleCloudPlatform/gcloud-node/issues/1120
  2. https://github.com/GoogleCloudPlatform/gcloud-node/issues/633
  3. 基本上所有的编辑都是在同一时间完成的(一旦done()被调用),所以如果有任何失败,整个交易将在那时中止。

    令人困惑的是,像transaction.get()这样的某些操作确实有回调。基本上,transaction.get()返回的实体版本需要与.save().delete()之前的版本匹配(如果版本调用done(),则会再次发生)如果不匹配,交易将自动中止。

    如果transaction.rollback()调用中的内容与您的代码所期望的内容不匹配,则使用.get()

    仍然有用。