NodeJS DB竞赛条件

时间:2018-10-30 21:50:07

标签: node.js mongodb concurrency

我正在使用带有Express的NodeJS来创建一个简单的rest api。我的工作流程:

  1. 我通过POST URI传递了一个对象
  2. 我想将其保存到数据库。如果它在数据库中,我想增加一次尝试保存对象的次数

我保存的代码如下:

await collection.updateOne({
      // match all the properties
    }, {
      $inc: {
        'encountered': 1
      }
    }, {
      upsert: true,
    });

但是,如果我一次进行多个并发调用,则会创建竞争条件。例如,如果我同时发出POST请求5次,则可能会得到两个结果:

一次,遇到:3x 第二次遇到:2x

我假设第一个插入在数据库中搜索,没有找到该项目,并且准备插入,而第二个插入有线程时间,没有找到项目,并且也为插入做好了准备。然后,第一个插入物被发射,增加数次,然后第二个插入物被发射,并增加数次。

我该如何处理?试图模拟单例的全局变量..?我仍然不确定那是否是线程安全的...我不介意性能较差,但是我需要数据库写入绝对是线程安全/原子的,即搜索和更新必须视为原子操作。

编辑:或者,我很乐意在我的上一个呼叫完全解决之前不接受任何POST呼叫(即阻止POST操作)。我不确定解决这个问题的正确NodeJS方法是什么。

Edit2:我也尝试过db.collection.createIndex,但随后写入失败。恐怕在重试此失败的写入后,我会遇到相同的问题。

0 个答案:

没有答案