【问题标题】:How to avoid racing issues using Cloud Firestore Triggers如何使用 Cloud Firestore 触发器避免赛车问题
【发布时间】:2019-07-18 09:57:01
【问题描述】:

我在 Firebase 上使用 Cloud Firestore onCreate 触发器,其中客户端是 React Native 应用程序。

用户通过在附加了onCreate 触发器的单独集合中写入来获得积分。用户可以一个接一个地创建多个单点文档。

示例: 用户 1 获得 3x100 分。这将创建三个文档并触发三次。

第一次执行 g 找到最后一个用户点数(例如 500)将其增加 100,并将新状态 = 600 保存到用户配置文件中。 同时,在这完成之前,触发第二个触发器,读取之前的状态,因为之前的触发器还没有完成,所以它仍然是 500,将它增加 100,并保存 600。 第三个设法做同样的事情。

最终用户应该得到 500 + 100 + 100 + 100 = 800 分,但他只有 600 分,因为在第一个触发器完成更新用户配置文件之前触发了最后一个触发器,并且所有中间的更改都被覆盖。

如何解决这个问题?

谢谢。

【问题讨论】:

标签: firebase google-cloud-firestore google-cloud-functions


【解决方案1】:

您需要使用transaction 来确保对公共文档的所有访问都是原子执行的。这将确保相互竞争的写入不会破坏彼此的更新。如果发生更新竞争,事务处理程序将使用更新的数据重试。

【讨论】:

  • 谢谢,我在此期间找到了它。登陆该页面有点困难,或者我搜索了错误的关键字。
  • 嘿@Doug 这与三个单独的 onCreate 触发器兼容吗?我已经尝试按照文档中的说明实现它,但我仍然从三个单独的 onCreate 触发器值更改中获得一个值更新。谢谢。
  • 变化的来源并不重要。它可以是任何后端或客户端代码。
猜你喜欢
  • 2018-03-27
  • 2021-05-23
  • 1970-01-01
  • 2021-03-14
  • 2020-02-04
  • 2019-11-13
  • 2018-03-27
  • 2019-02-06
  • 2020-10-15
相关资源
最近更新 更多