【问题标题】:Firebase Firestore - How to prevent concurrent writes?Firebase Firestore - 如何防止并发写入?
【发布时间】:2019-06-20 04:02:14
【问题描述】:

我目前正在开发一个我正在使用 Firestore 的问答应用程序。

当前情景 - 一个人会问一个问题。这个问题与多人匹配。但是,只有其中一个人可以声称该问题和答案。当有人提出问题时,我将问题文档上的状态从“待处理”更改为“已申领”。为了避免两个人提出同一个问题,我在交易中有逻辑。我仅在问题状态仍为“待处理”时更新文档。

当前问题 - 如果两个人同时尝试提出该问题,我的应用程序会崩溃并显示“错误·Firestore:操作已中止,通常是由于事务中止等并发问题(firestore/中止)。”

我对错误的理解不足以解决这个问题。我该如何解决这个问题?

一般问题 - 如何确保一次只有一个人可以更新 Firestore 文档?任何待处理的更新都不会导致应用崩溃?

【问题讨论】:

  • 没有看到您的代码,就无法判断您是否正确地做事。交易并没有从根本上破坏。
  • 你会碰巧知道一些关于错误信息的事情吗?错误·Firestore:操作被中止,通常是由于事务中止等并发问题(firestore/aborted)。
  • 听起来你做了一些事情来中止交易。

标签: firebase google-cloud-firestore


【解决方案1】:

我怀疑以下情况。

A人:申领成功,交易成功。

B 人:无法提出问题,您的代码(事务回调)以错误结束。它一直重复到 5 次限制,但是您的代码不能正确处理并且每次都失败。超过 5 个限制后,整个 Transaction 承诺将返回失败响应。

要修复您的代码,您应该成功结束 B 人 的交易(无声明),然后检查他/她是否已成功声明该问题。它将执行如下:

A人:在1轮交易中成功认领问题

人B:在1轮交易中失去竞争条件,因为同时发生了写操作而第二次执行交易。在第 2 轮中,您检测到它已被认领,并在没有认领的情况下优雅地完成交易。

我希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-17
    • 1970-01-01
    • 2020-04-12
    • 1970-01-01
    • 2020-10-08
    • 1970-01-01
    • 2020-11-03
    • 2022-11-10
    相关资源
    最近更新 更多