更新.js
import Task from "../models/Task.js";
import UserScreening from "../models/UserScreening.js";
const session = await mongoose.startSession();
session.startTransaction();
['_id1','_id2','_id3'].forEach(async (r) => {
await Task.findByIdAndUpdate(
r,
{ $push: { UserScreening: userscreening, user: existingUser } },
{ session }
);
});
userscreening = await UserScreening.update({},{}{ session });
session.commitTransaction();
在上面的代码行中,我想更新多个集合。所以我正在使用会话。会议对我来说是强制性的。因为我希望所有操作都成功完成或失败。但我不知道 _ids 数组的正确方法。所以我在交互时遇到错误。收到错误“MongoServerError:WriteConflict 错误:此操作与另一个操作冲突”。请重试您的操作或多文档事务。'
WriteConflict
错误是并发管理游戏的一部分。
想象两个并行事务几乎同时尝试更新集合中的同一文档。
为了保证隔离,任何符合 ACID 的数据库都必须实施此类护栏,并将决定权交还给客户端。
在 MongoDB 中,事务有两种 API:Core 和 Callback。回调 API 的
withTransaction
自动重试 瞬态错误,包括 WriteConflict
,但是,核心 API 显然不会附带如此花哨的口哨,这一切都取决于实现者。
值得注意的是,如果使用 Callback API,仍然可能会发生
WriteConflict
。也就是说,通常,即使内部重试由于事务提交的时间而失败。
总的来说,第一个行动方案是重试失败的交易。