MongoDB 事务 + Promise.all(),会有部分数据操作失败。这是为啥?

2021-12-02 16:59:09 +08:00
 IvanLi127

下面两段代码,第一段只有部分记录能更新成功,第二段代码正常。有大佬知道啥原因吗?

  await Promise.all(
      tuples.map(async ([list, count]) => {
        // await this.listModel.findOne({ _id: list }); // 存在这行也正常,不存在的话就不正常。
        await this.listModel.updateOne(
          { _id: list },
          {
            $inc: {
              sampleCount: -count,
            },
          },
          { session },
        );
      }),
    );
  for (const [list, count] of tuples) {
      await this.listModel.updateOne(
        { _id: list },
        {
          $inc: {
            sampleCount: -count,
          },
        },
        { session },
      );
    }

我排查了下,updateOne 方法都能返回修改成功一行数据,所以更新是成功的,但是最后事务执行完毕后只查到部分数据有正常更新。

MongoDB 4.4 。

1757 次点击
所在节点    MongoDB
2 条回复
IvanLi127
2021-12-02 17:13:19 +08:00
破案了,我在更上层的函数调用中漏写了个 await 导致这个问题。前面能成功也是刚好在事务提交前执行完毕了。我还以为遇到灵异事件了
clf
2021-12-02 18:13:20 +08:00
MongoDB 事务唯一比较蛋疼的就是 Save/Insert 不能自动建集合了( SpringBoot 的 MongoTemplate ),所以现在会手动在跑项目的时候扫描一遍代码检查是否已经建了集合,没有的话就自动初始化集合。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/819589

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX