如何将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
相关产品推荐
相关产品推荐

