mongoose MongoServerError:WriteConflict错误:此操作与另一个操作冲突,请重试您的操作或多文档事务

qoefvg9y  于 11个月前  发布在  Go
关注(0)|答案(1)|浏览(179)

在下面的代码中,我尝试在一个事务中更新多个集合:

# 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错误:此操作与另一个操作冲突。请重试您的操作或多文档事务。

lvjbypge

lvjbypge1#

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

相关问题