【问题标题】:Firestore Transaction Semantics With Read Queries带有读取查询的 Firestore 事务语义
【发布时间】:2018-11-28 17:17:13
【问题描述】:

docs 中指出,交易失败,当:

事务读取了在事务之外修改的文档。

我想知道这是否也适用于读取查询,它可能返回多个文档(通过.where('x', '==', 'y'))。如果在事务期间再次执行 Read 查询会返回更多结果,事务是否仍然失败?

为了说明我的问题,假设我有一组具有以下架构的汽车:

{ 
   ownerId: string, 
   make: string,
   horsepower: int
   ...
}

现在我在transaction.get() 电话中查询某个车主的汽车:

transaction.get(firestore.collection('cars').where('ownerId', '==', '123'))...

假设我收到带有 2 辆汽车的 Snapshot,基于这些汽车,我想在交易中做一些魔术。在交易期间,为该车主添加另一辆车(因此它不是初始快照的一部分)。这种情况下交易会失败吗?

PS:我不是在寻找不同的解决方案,上面的例子是虚构的,我只是想了解事务在这种情况下是如何表现的。

【问题讨论】:

    标签: firebase transactions google-cloud-firestore


    【解决方案1】:

    假设我收到 2 辆汽车的快照,基于这些汽车我想在交易中做一些魔术。在交易期间,为该车主添加了另一辆车(因此它不是初始快照的一部分)。这种情况下交易会失败吗?

    绝对没有。由于新添加的汽车不属于初始交易,因此不会失败。添加的汽车被视为新添加的对象,而不是修改过的对象。

    他们在文档中提到:

    事务读取了在事务之外修改的文档。

    因为事务绝对需要与服务器进行往返通信,以确保事务中的代码成功完成。因此,如果该特定文档被已涉及的事务以外的操作修改,则该事务将失败。

    【讨论】:

    • 此外,在我的日常任务中,当我遇到这样的用例时,它会困扰我很多,为了编写 100% 可靠的业务逻辑,事务应该 重试本身拒绝任何传入的写入到数据库,这可能会改变查询的范围。是否有任何最佳实践或完全可靠的解决方案来解决这些情况。
    • @MohammedMaaz 最好使用自己的MCVE 发布一个新问题。
    猜你喜欢
    • 2010-09-23
    • 1970-01-01
    • 1970-01-01
    • 2020-01-19
    • 1970-01-01
    • 2020-07-10
    • 1970-01-01
    • 2021-10-12
    • 2020-11-05
    相关资源
    最近更新 更多