如何使用Cloud Firestore触发器避免竞速问题

时间:2019-07-18 09:57:01

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

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

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

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

第一次执行g找到最后一个用户点数(例如500),将其增加100,并将新状态= 600保存到用户配置文件中。 同时,在完成此操作之前,将触发第二个触发器,读取由于前一个触发器尚未完成而仍为500的前一个状态,将其增加100,还保存600。 第三个人设法做到这一点。

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

如何解决这个问题?

谢谢。

1 个答案:

答案 0 :(得分:1)

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