我正在使用带有Express的NodeJS来创建一个简单的rest api。我的工作流程:
我保存的代码如下:
await collection.updateOne({
// match all the properties
}, {
$inc: {
'encountered': 1
}
}, {
upsert: true,
});
但是,如果我一次进行多个并发调用,则会创建竞争条件。例如,如果我同时发出POST请求5次,则可能会得到两个结果:
一次,遇到:3x 第二次遇到:2x
我假设第一个插入在数据库中搜索,没有找到该项目,并且准备插入,而第二个插入有线程时间,没有找到项目,并且也为插入做好了准备。然后,第一个插入物被发射,增加数次,然后第二个插入物被发射,并增加数次。
我该如何处理?试图模拟单例的全局变量..?我仍然不确定那是否是线程安全的...我不介意性能较差,但是我需要数据库写入绝对是线程安全/原子的,即搜索和更新必须视为原子操作。
编辑:或者,我很乐意在我的上一个呼叫完全解决之前不接受任何POST呼叫(即阻止POST操作)。我不确定解决这个问题的正确NodeJS方法是什么。
Edit2:我也尝试过db.collection.createIndex
,但随后写入失败。恐怕在重试此失败的写入后,我会遇到相同的问题。