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

如何将mongoose的updateMany操作纳入同一事务中执行

Mongoose的updateMany()方法和save()的事务绑定逻辑一致,只需要在方法的第三个参数(配置项)中传入session即可绑定到当前事务,修改方式如下:

await SubDomain.updateMany(
  { _id: { $in: req.body.subDomains } },
  { $push: { services: newService._id } },
  { session: sess } // 新增该行即可绑定当前事务会话
);

完整的事务执行流程(含异常回滚、会话关闭逻辑)参考:

const sess = await mongoose.startSession();
try {
  sess.startTransaction();

  const newService = new Service({
    _id: mongoose.Types.ObjectId(),
    subDomains: req.body.subDomains,
    // 其他业务字段
  });

  // 保存新服务,绑定事务
  await newService.save({ session: sess });

  // 批量更新关联子域名,绑定同一事务
  await SubDomain.updateMany(
    { _id: { $in: req.body.subDomains } },
    { $push: { services: newService._id } },
    { session: sess }
  );

  // 所有操作无异常,提交事务
  await sess.commitTransaction();
} catch (err) {
  // 任意操作失败,回滚所有改动
  await sess.abortTransaction();
  throw err;
} finally {
  // 关闭会话
  sess.endSession();
}

补充说明:不止updateMany,Mongoose中updateOne、deleteMany、findOneAndUpdate、insertMany等所有写操作方法,都支持通过最后一个参数传入{ session: 会话对象 }的方式加入事务,规则和save完全一致。

内容的提问来源于stack exchange,提问作者Tayyab Ferozi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 00:42:00