Firestore事务涉及查询时的锁定机制及执行逻辑咨询
Firestore事务查询的锁定行为解析
锁定范围:仅查询返回的特定文档
Firestore事务不会锁定查询所在的整个集合或集合组,只会锁定查询返回的具体文档。以你提供的Node.js示例为例:
const db = admin.firestore(); const fireQuery = db.collectionGroup('my-collection') .where('role', '==', 'user'); await db.runTransaction(async transaction => { // Query documents and lock them while performing the update. const querySnap = await transaction.get(fireQuery); // Perform write operations on the retrieved documents... });
这段代码中,只有集合组my-collection里满足role == 'user'的文档会被事务锁定,集合组内其他文档或整个集合组不会受到锁定影响。
事务如何锁定查询返回的文档?
Firestore的事务机制是原子性+乐观并发控制结合的模式,不存在“提前确定锁定文档”的问题:
- 当事务执行
transaction.get(fireQuery)时,Firestore会在当前事务上下文内执行查询,获取符合条件的文档快照,同时立即对这些文档加排他锁,阻止其他事务修改它们。 - 锁定状态会持续到事务提交成功或回滚结束。如果其他事务尝试修改被锁定的文档,会被阻塞,直到当前事务完成。
- 如果在事务执行期间,有外部操作修改了查询结果中的文档,Firestore会自动触发事务重试:重新执行查询获取最新的文档快照,再次锁定,然后执行后续的写操作,直到事务成功完成或达到系统重试上限。
内容的提问来源于stack exchange,提问作者pcba-dev
相关产品推荐
相关产品推荐

