【发布时间】:2020-12-03 02:20:54
【问题描述】:
在文档中它说:
在并发编辑的情况下,Cloud Firestore 会再次运行整个事务。例如,如果一个事务读取文档,而另一个客户端修改了这些文档中的任何一个,则 Cloud Firestore 会重试该事务。此功能可确保事务在最新且一致的数据上运行。
但这是否包括文档的创建/删除?
例如
想象一下这种情况,用户可以在按下“Action A”或“Action B”按钮时重新创建/删除两个文档“A”或“B”。
两个文档的创建/删除是并行进行的。
两个文档都被添加到/从同一个集合中删除。
算法
(查看我在阅读时添加的图像)
当从这个集合中创建/删除一个文档时,触发函数开始执行以下代码:
if(docB has been deleted) {
if(docA exists) {
// Create a document... other operations
console.log("HERE")
}
}
/* else if(docA has been created) {
...
} */
问题来自这种情况:
Initial state: (second 0)
- docA is not created
- docB is created
Both actions running in parallel:
-started Action A (second 0)
-started Action B (second 0)
-finished Action B -> docB has been deleted (second 1.1)
-finished Action A -> docA has been created (second 1.11)
如您所见,这是由于在前端按两个按钮过快(或网络延迟,...)而导致的并发问题。
可以通过将算法包装在“数据库事务”中来解决这个问题吗?我的意思是,如果在交易完成之前创建/删除了算法所依赖的文档,交易是否会被重新执行(或其他什么)?
Pd:我也尝试过检查 onTrigger 函数中所有可能的状态...但问题是同一函数的两个实例可以并行运行...
有什么想法吗? 谢谢。
算法图像
【问题讨论】:
标签: firebase asynchronous google-cloud-firestore google-cloud-functions nosql