角式炸药批处理和交易



我一直在为此理论挣扎了几个星期,并在互联网上检查了所有东西,但找不到任何真正有帮助的东西,所以我第一次接触到SO社区。

我在Firestore(用户,事件和交易(中有3个集合。添加新事件时,我需要:

  1. 事件添加新文档 Collection
  2. 更新用户中的余额文档。
  3. 事务中添加一个新文档收集需要从2中使用新余额。

现在,这些都必须取得成功,或者如果其中任何一个失败,那么它们都必须失败必须按顺序完成(我不能使用阶段的阶段2中的余额3阶段2完成之前!(这将我指向交易,但您无法执行并添加交易

交易由任意数量的get((操作组成,然后是任何数量的写操作,例如set((,update((或delete((。

所以我研究了批处理,但再次不允许

如果您不需要读取操作集中的任何文档,则可以作为单个批次执行多个写入操作,其中包含set((,update((或delete((操作的任何组合。

所以我有点困惑。

我开始研究异步/等待,但是,尽管这将等待先前的操作完成,然后再进行下一个动作,但每当发生错误时,它都不会让我回滚(我们,我们不容易!(。

我的应用在Angular 4中

方法1:

一种可能的解决方案是火箱触发器:

https://firebase.google.com/docs/functions/firestore-events

  • 事件发动触发器以更新用户文档上的余额

  • 用户onupdate触发以添加事务文档

这还提供了不需要回滚错误的附加优势。如果步骤1失败,则步骤2将不会运行,并且如果步骤2失败,则步骤3将不会运行。步骤2成功,步骤3失败。

方法2:

set((函数与添加的工作方式相似。一个区别是,您必须在特定文档上设置数据之前设置文档ID。这样,您可以使用交易来更新和添加文档。如果您使用的是AngularFire2,则看起来像这样的例子:

this.afs.doc('transactions/' + this.afs.createId()).set(transactionData);

您很可能希望使用上述两种方法的组合,具体取决于用户应具有客户端的写入访问水平。我推荐的解决方案是使用触发触发的事件,并在触发器内有一个交易,该事件更新用户并设置了交易文档。

最新更新