在下面的代码中,我尝试在一个事务中更新多个集合:
# update.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错误:此操作与另一个操作冲突。请重试您的操作或多文档事务。
1条答案
按热度按时间lvjbypge1#
WriteConflict
错误是并发管理游戏的一部分。假设两个并行事务试图几乎同时更新集合中的同一文档。
为了保证隔离性,任何ACID兼容的数据库都必须在适当的位置实现这样的护栏,并将决策移交给客户机。
在MongoDB中,事务有两种API:Core and Callback。回调API的
withTransaction
自动重试包括WriteConflict
在内的瞬时错误,然而,核心API显然没有这种花哨的哨声,这完全取决于实现者。值得注意的是,如果使用回调API,
WriteConflict
仍然可能发生。也就是说,通常情况下,即使是内部重试也会由于事务提交的时间而失败。总的来说,第一个动作是重试失败的事务。