You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 13:30:13