不存在的文档的Firestore交易锁定行为

时间:2019-10-12 17:48:42

标签: firebase transactions google-cloud-firestore

Firestore事务对其中读取的文档持有悲观的锁定。即使文档不存在,此锁也适用吗?

下面是nodejs docs中的示例:

firestore.runTransaction(transaction => {
  let documentRef = firestore.doc('col/doc');
  return transaction.get(documentRef).then(doc => {
    if (doc.exists) {
      transaction.update(documentRef, { count: doc.get('count') + 1 });
    } else {
      transaction.create(documentRef, { count: 1 });
    }
  });
});

如果两个事务读取并修改了相同的不存在的文档col/doc,其中之一将失败并尝试重新运行吗?

create方法还具有其自身的失败行为-“如果文档位于指定位置,则该操作将使事务失败。”在这种情况下,与set + merge相比,create的使用是否安全?

1 个答案:

答案 0 :(得分:1)

通常,如果在事务中读取文档后文档的内容发生变化,则在同一笔事务中写回文档之前,将重试事务处理程序,并且文档的新内容将为在重试中看到。

在您的特定情况下, $disk = 'dropbox'; $file = Storage::disk($disk)->get('Apps/CordovaFast/sample-connection-1425502866/cordova.ios.js'); return Storage::download($file); 的内容从不存在更改为存在。我完全希望它能像处理文档中的任何其他更改一样工作,并且如果它突然不存在的话会导致重试事务。