MongoServerError:WriteConflict 错误:此操作与另一个操作冲突。请重试您的操作或多文档交易

问题描述 投票:0回答:1

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

mongodb mongoose mongodb-query
1个回答
0
投票

WriteConflict
错误是并发管理游戏的一部分。

想象两个并行事务几乎同时尝试更新集合中的同一文档。

为了保证隔离,任何符合 ACID 的数据库都必须实施此类护栏,并将决定权交还给客户端。

在 MongoDB 中,事务有两种 API:Core 和 Callback。回调 API 的

withTransaction
自动重试 瞬态错误,包括
WriteConflict
,但是,核心 API 显然不会附带如此花哨的口哨,这一切都取决于实现者。

值得注意的是,如果使用 Callback API,仍然可能会发生

WriteConflict
。也就是说,通常,即使内部重试由于事务提交的时间而失败。

总的来说,第一个行动方案是重试失败的交易。

© www.soinside.com 2019 - 2024. All rights reserved.