Firestore事务能否更新事务外获取的对象?是否需重取order?
关于Firestore事务内是否必须重新获取对象的问题
是的,必须在Firestore事务内部重新获取order对象,原因如下:
- Firestore事务的核心是保障「读取-修改-写入」的原子性,要求所有参与事务的读取操作都通过
transaction.get()完成。只有这样,Firestore才能跟踪文档的版本信息,在提交事务时检查这些文档是否在你读取后被其他操作修改——如果有冲突,事务会自动重试,确保数据一致性。 - 若使用事务外提前加载的order对象,它的状态是事务启动前的快照,Firestore无法跟踪其版本变化。直接用这个旧状态更新会绕过事务的冲突检测,可能导致数据覆盖、不一致,完全失去事务的意义。
你提供的代码中,在事务内通过transaction.get(orderRef)获取order对象的做法是完全正确的,能确保事务正常工作:
try { await runTransaction(db, async (transaction) => { // First object to update const dailyCountSnap = await transaction.get(dailyCountRef); let dailyCount; if (dailyCountSnap.exists) { dailyCount = dailyCountSnap.data(); } else { return Promise.reject(`ERROR: No daily count found`); } /* ... Code to update dailyCount ... */ transaction.set(dailyCountRef, {...}); // Second object to update const orderSnap = await transaction.get(orderRef); let order; if (orderSnap.exists) { order = orderSnap.data(); } else { return Promise.reject(`ERROR: No order found`); } /* ... Code to update order ... */ transaction.update(orderRef, {...}); }); } catch (e) { functions.logger.error(e); }
总结:所有需要在事务中修改的文档,都必须在事务内部通过transaction.get()读取,才能让Firestore保障事务的原子性和数据一致性。
内容的提问来源于stack exchange,提问作者Yoann Hercouet
相关产品推荐
相关产品推荐

