Nodejs,MongoDB并发请求创建重复记录

时间:2019-12-18 20:10:52

标签: node.js mongodb express concurrency

让我变得真正简单。我正在运行node.js服务器。从补丁程序请求接收数据时,首先需要检入数据库。如果该行存在,我将对其进行更新,否则,我将创建该记录。这是我的代码。这就是我在请求处理程序回调中调用的内容。

let dbCollection = db$master.collection('users');
createUser(req.body).then(user => {
  dbCollection.updateMany(
    { rmisId: req.body.rmisId },
    { $set: { ...user } },
    { upsert: true }
  ).then((result) => {
    log.debug("RESULTS", user);
    return result;
  })
    .catch((err => {
      log.debug(err);
      return err;
    }));
})

这在顺序请求中运行良好。但是当我收到10个并发请求时,它会创建重复记录。我正在本地计算机上运行,​​并使用Apache JMeter复制并发请求。如果您遇到这种问题,请帮助我。

谢谢!

更新

我已经测试了另一种读取数据库的方法,例如dbCollection.find({rmisId: req.body.rmisId})数据库,以确定其是否存在。但这根本没有区别。

1 个答案:

答案 0 :(得分:1)

您无法检查和更新。 Mongodb操作在文档级别是原子的。在检查并确认记录不存在之后,可能会再次请求创建您刚刚检查的文档,然后,如果您没有唯一索引或正在生成ID,则可以重新创建同一记录。

相反,您可以像已经在使用upsert一样使用,但无需创建。看起来您正在从请求中获取ID,因此只需使用该ID进行搜索,然后添加用户记录即可。这样,如果其他线程在执行此操作之前将其插入,则将更新先前插入的线程。如果您不喜欢这种方式,请为该用户ID字段添加唯一索引。