【问题标题】:Do firestore transactions run again when concurrent document creation/deletion?并发文档创建/删除时,firestore 事务是否会再次运行?
【发布时间】: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


    【解决方案1】:

    [Firestore 的事务机制] 是否包括文档创建/删除?

    文档的创建和删除是对文​​档的修改,因此包含在您引用的保证中。

    【讨论】:

    • 太棒了!谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-02
    • 2018-11-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多