首页 > 解决方案 > 不存在文档的 Firestore 事务锁定行为

问题描述

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

按照nodejs 文档中的示例:

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 是否安全?

标签: firebasetransactionsgoogle-cloud-firestore

解决方案


一般来说,如果一个文档的内容在事务中读取后发生变化,在同一个事务中写回之前,事务处理程序将被重试,并且文档的新内容将在重试。

在您的特定情况下,内容会documentRef发生变化,变为不存在,变为存在。我完全期望它会像文档上的任何其他更改一样起作用,如果它突然存在于以前不存在的地方,它会导致事务重试。


推荐阅读