具有读取查询的Firestore交易语义

时间:2018-11-28 17:17:14

标签: firebase transactions google-cloud-firestore

docs中,当发生以下情况时,说明交易失败:

  

交易读取了在交易之外修改的文档。

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

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

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

现在,我在transaction.get()通话中查询某位拥有者的汽车:

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

比方说,我收到了一辆Snapshot的两辆汽车,根据这些汽车,我想在交易中做些魔术。在交易过程中,为此所有者添加了另一辆汽车(因此它不属于初始快照的一部分)。在这种情况下交易会失败吗?

PS:我不是在寻找其他解决方案,上面的示例是虚构的,我只想了解事务在这种情况下的行为。

1 个答案:

答案 0 :(得分:1)

  

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

绝对不会。由于新添加的汽车不在初始交易范围之内,因此不会失败。添加的汽车被认为是新添加的对象,而不是被修改的对象。

他们在文档中提到:

  

交易读取了在交易之外修改的文档。

因为事务绝对需要与服务器进行往返通信,以确保事务中的代码成功完成。因此,如果该特定文档通过除已涉及的事务之外的其他操作修改而导致事务失败,那么这就是为什么。