【问题标题】:Angular Firestore Batches and TransactionsAngular Firestore 批处理和事务
【发布时间】:2018-07-28 22:28:11
【问题描述】:

我已经为这背后的理论苦苦挣扎了几个星期,并在整个互联网上进行了检查,但找不到任何真正帮助我的东西,所以我第一次接触到 SO 社区。​​p >

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

  1. 将新文档添加到 events 集合
  2. 更新用户文档中的余额。
  3. transaction集合中添加一个新文档,该集合需要使用上面2.中的新余额。

现在,这些必须要么全部成功,要么如果其中任何一个失败,那么它们都必须失败并且它们必须按顺序完成(我不能使用阶段 2 中的余额3 在第 2 阶段完成之前!)这指向了我的交易,但你不能在交易中执行和添加

一个事务由任意数量的 get() 操作和任意数量的写操作组成,例如 set()、update() 或 delete()。

所以我查看了批次,但再次不允许添加

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

所以我有点困惑。

我开始研究 async/await,但是,虽然这将等待上一个操作完成后再进行下一个操作,但它不允许我在发生错误时回滚(我们会,不容易!) .

我的应用程序在 Angular 4 中,但任何 Javascript 帮助将不胜感激.....

【问题讨论】:

    标签: javascript angular firebase


    【解决方案1】:

    方法一:

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

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

    • 事件 onCreate 触发更新用户文档上的余额

    • 用户 onUpdate 触发添加交易文档

    这还提供了不需要回滚错误的额外好处。如果第 1 步失败,第 2 步将不会运行,如果第 2 步失败,第 3 步将不会运行。有可能第 2 步成功,第 3 步失败。

    方法二:

    set() 函数的工作方式与 add 的工作方式类似。一个区别是您必须在设置特定文档的数据之前设置文档 ID。这样,您可以使用事务来更新和添加文档。如果您使用的是 AngularFire2,示例如下所示:

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

    您很可能希望结合使用上面提供的两种方法,具体取决于用户应在客户端拥有的写访问权限级别。我推荐的解决方案是使用事件 onCreate 触发器,并在触发器内有一个事务来更新用户并设置事务文档。

    【讨论】:

    • 嗨,埃里克。谢谢回复。您建议的解决方案看起来像赢家。我能看到的唯一问题是,当我更新用户文档中的余额时,它需要在事务中,以防在我们尝试更改值时更改它。如何在“外部”单笔交易中获得这笔交易?
    • 如果在更新文档时余额发生变化,交易将重试。这是由firestore自动处理的。您只需要一个带有设置和更新的事务。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-26
    • 2021-05-31
    • 1970-01-01
    • 1970-01-01
    • 2014-05-15
    • 1970-01-01
    相关资源
    最近更新 更多