firebase - 不存在文档的 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 是否安全?
解决方案
一般来说,如果一个文档的内容在事务中读取后发生变化,在同一个事务中写回之前,事务处理程序将被重试,并且文档的新内容将在重试。
在您的特定情况下,内容会documentRef
发生变化,变为不存在,变为存在。我完全期望它会像文档上的任何其他更改一样起作用,如果它突然存在于以前不存在的地方,它会导致事务重试。
推荐阅读
- java - 每次在 firebase DB 中更改数据时都会调用 onDataChange()
- java - 如何解决原因:java.lang.ClassNotFoundException: javax.xml.bind.JAXBException 迁移到 Java 11(Openjdk-11.0.1)
- sql - 如何从两个不同的源表在单个表中插入值
- google-bigquery - BigQuery ML 无法识别数据中的标签列
- mysql - 从不同表中划分 2 个值的问题
- java - 将项目添加到文本文件
- sql - 是否有任何更快、更少资源消耗的查询用于相同目的?
- php - ReflectionException:类邮件程序不存在
- javascript - Javascript:尝试平滑自定义光标动画
- multithreading - 并行执行的 CPU 性能分析