MongoDB findOneAndUpdate 并发执行

问题描述 投票:0回答:1

我有一个 MongoDB 集合。 架构:

{
    "_id": ObjectId 
    "status": String
}

数据:

{
    "_id": 1,
    "status": "waiting"
}

线程A和线程B并发执行

findOneAndUpdate({"_id": "1", "status": "waiting"}, {$set: { "status": "running"}})

虽然findOneAndUpdate是原子操作,但是是否可以同时查找文档呢?

谢谢

我模拟了1000个线程执行,最终只有一个线程输出文档。但我不确定我是否正确

mongodb concurrency findandmodify
1个回答
0
投票

MongoDB 中的更新本质上并不是原子性的。

虽然更新使用read-mutate-write,并且多个更新进程可以同时访问文档,但是当它将更改写入存储引擎时,查询部分会针对文档重新检查,如果不再匹配,更新因写入冲突而中止。

在您的示例中,查询部分与更新部分更改的相同“状态”字段匹配。这意味着,如果有多个进程尝试更新,它们将竞相查看哪个进程先完成,但在一个进程完成后,所有其他已经正在进行的更新都将因写入冲突而失败,并且任何尚未记录的更新都会失败与修改后的文档完全不匹配。

© www.soinside.com 2019 - 2024. All rights reserved.