Firestore事务执行耗时超2分钟,云函数性能异常求助
Firestore事务性能异常(耗时数分钟)的排查与修复
问题根源
你的核心错误是事务内部的读写操作没有通过事务对象t执行,而是直接调用admin.firestore()发起了独立的Firestore请求:
- Firestore事务要求所有在事务上下文内的读写操作,必须通过传入的事务对象
t来执行,这样才能纳入事务的原子性控制逻辑。 - 你代码里的
set、update、delete都是直接调用Firestore实例方法,属于事务外的独立操作。事务会一直等待这些外部异步操作完成,再加上事务本身的锁机制,最终导致云函数耗时剧增到数分钟。
修正后的代码
所有操作必须通过事务对象t执行,以下是优化后的版本:
await admin.firestore().runTransaction(async (t) => { const document = await t.get(truthRef); if (document.data() !== undefined) { const roomRef = admin.firestore().collection("a").doc(b); // 所有操作通过事务对象t执行 const transactionOps = [ t.set(roomRef, c), t.update(roomRef, { messages: allMessagesHistory }), t.delete(oldTruthHistoryRef) ]; await Promise.all(transactionOps); } });
关键注意事项
- 事务内的所有读写必须绑定事务对象
t,不能直接调用Firestore实例方法,否则会破坏事务原子性,同时引发性能异常。 - 简单的数据迁移/调整操作,只要正确使用事务对象,不会出现数分钟的耗时,性能和非事务模式差距极小。
- 如果你的业务不需要严格的原子性(允许中间状态存在),可以继续用非事务方式;但如果需要保证数据一致性,必须修正事务的使用方式,而非直接放弃事务。
内容的提问来源于stack exchange,提问作者coolcool1994
相关产品推荐
相关产品推荐

