如何在cloud_firestore_odm中正确执行Cloud Firestore事务更新?
使用cloud_firestore_odm通过事务更新Firestore数据的正确方式
你的事务代码存在两个核心问题:
- 错误地在
runTransaction回调外部执行事务更新操作,Firestore事务的所有操作必须在回调内部完成,否则无法保证原子性。 - 原
runTransaction的回调没有执行任何实际操作,直接返回了事务对象,不符合事务的使用逻辑。
正确的实现方式如下:
await FirebaseFirestore.instance.runTransaction((transaction) async { // 1. 获取目标文档引用 final userDoc = usersRef.doc('foo_id'); // (可选但推荐)先读取文档,确保基于最新数据更新 final snapshot = await transaction.get(userDoc); if (!snapshot.exists) { // 处理文档不存在的情况 throw Exception('用户文档不存在'); } // 2. 在事务回调内部调用transactionUpdate执行更新 await userDoc.transactionUpdate( transaction, name: 'John', ); });
关键说明:
- 所有事务相关操作(读取、更新)必须包裹在
runTransaction的回调函数中,Firestore会自动处理事务的提交、重试逻辑。 - 调用
transactionUpdate时必须使用await,确保更新操作在事务上下文内完成。 - 建议先读取文档再更新,避免基于过时数据修改,同时可以处理文档不存在的异常场景。
内容的提问来源于stack exchange,提问作者iDecode
相关产品推荐
相关产品推荐

