Firebase事务重试触发规则疑问:t.get与普通get的场景差异
Firebase 事务重试机制问题解答
问题1解答
会触发重试。
Firestore 事务的版本校验逻辑发生在最终提交阶段,会校验所有通过事务上下文 t.get() 读取的文档的版本是否和读取时的版本完全一致:只要事务还没有完成最终提交,哪怕你已经执行完 t.update() 操作,只要之前通过 t.get() 读取的 col1.doc1、col2.doc2 出现外部变更,都会导致提交阶段的版本校验失败,触发 runTransaction 自动重试。
问题2解答
不会触发重试。
只有通过事务上下文 t.get() 读取的文档才会被纳入事务的版本追踪范围,直接调用普通 get() 方法读取文档的操作完全绕开了事务的读取追踪逻辑,事务在提交阶段不会校验这类文档的版本变化,因此 col3.doc3 出现外部变更不会触发重试。
需要注意的是:官方明确禁止在事务代码块内使用非事务型的读写API,普通 get() 拿到的快照不会跟随事务重试更新,很容易导致事务逻辑基于旧数据执行,出现数据一致性问题。
内容的提问来源于stack exchange,提问作者Shaun
相关产品推荐
相关产品推荐

