我有一个 MongoDB 集合。 架构:
{
"_id": ObjectId
"status": String
}
数据:
{
"_id": 1,
"status": "waiting"
}
线程A和线程B并发执行
findOneAndUpdate({"_id": "1", "status": "waiting"}, {$set: { "status": "running"}})
虽然findOneAndUpdate是原子操作,但是是否可以同时查找文档呢?
谢谢
我模拟了1000个线程执行,最终只有一个线程输出文档。但我不确定我是否正确
MongoDB 中的更新本质上并不是原子性的。
虽然更新使用read-mutate-write,并且多个更新进程可以同时访问文档,但是当它将更改写入存储引擎时,查询部分会针对文档重新检查,如果不再匹配,更新因写入冲突而中止。
在您的示例中,查询部分与更新部分更改的相同“状态”字段匹配。这意味着,如果有多个进程尝试更新,它们将竞相查看哪个进程先完成,但在一个进程完成后,所有其他已经正在进行的更新都将因写入冲突而失败,并且任何尚未记录的更新都会失败与修改后的文档完全不匹配。