Firestore多事务操作不同文档是否会因竞争被终止?
Firestore事务重试与跨文档竞争的行为疑问
我的集合中有10个文档,10个请求几乎同时进入并执行相同查询。每个请求都会启动独立的transaction,尝试读取1个document并将其删除。根据Firestore文档关于document contention的说明,当同一document上发生多次事务时似乎会引发竞争错误(文档未明确次数)。
Cloud Firestore resolves data contention by delaying or failing one of the operations.
在此场景下,假设其中1个事务提交成功,其余9个操作同一document的事务会因查询的document已变更无法提交而重试,之后这9个事务会尝试操作其他document,直至所有请求完成文档删除且无活跃事务。想咨询:这些不断重试的事务,即使每次操作不同document,是否会因竞争被ABORTED?还是会因每次竞争发生在不同document而持续延迟重试?
回答
- 当事务重试时操作不同文档的情况下,不会因为跨文档的竞争被直接ABORTED。Firestore的事务竞争限制是针对单个文档的冲突——只有当多个事务同时争抢同一个文档的读写权限时,才会触发延迟或失败机制。
- 你的场景中,重试的事务每次切换到新文档,相当于每次竞争都发生在不同的文档上,Firestore会针对每个单独的文档冲突进行处理:可能会短暂延迟该事务,直到目标文档可用,而不是直接终止整个事务。
- 只有当某个事务在重试过程中,反复遭遇同一个文档的竞争(比如多次重试都选中了被其他事务锁定的文档),才有可能达到重试次数上限被ABORTED。但在你的场景里,因为总共有10个文档和10个请求,每个重试的事务最终都会找到未被处理的文档,大概率会完成操作,而不会被ABORTED。
内容的提问来源于stack exchange,提问作者Forrest
相关产品推荐
相关产品推荐

