这是一个创建于 576 天前的主题,其中的信息可能已经有所发展或是发生改变。
MongoDB 有一个 Document ,它的 Schema 如下
{
"_id": ObjectId // 主键
"status": String
}
数据库里面有一条数据
{
"_id": 1,
"status": "waiting"
}
现在两个线程 A,B ,线程 A 和 B 并发执行 findOneAndUpdate({"_id": "1", "status": "waiting"}, {$set: { "status": "running"}})
虽然 findOneAndUpdate 是原子操作,但是有没有可能同时查找出该文档。
4 条回复 2024-03-13 13:02:54 +08:00  | | 1 zhangqian99 2024-03-12 15:32:21 +08:00 虽然两个线程同时尝试执行 findOneAndUpdate 操作,因为操作的原子性,只有一个线程能成功更新文档。虽然条件相同,另一个线程会找不到匹配的文档来更新 |
 | | 2 cyhulk 2024-03-12 16:18:07 +08:00 @ zhangqian99 他的问题是 find 并发的时候能不能读到,感觉可以读到但是更新不了,没有 mysql 的那些事务隔离吧 |
 | | 3 shakeyo 2024-03-12 16:38:43 +08:00 可以读到但更新不了,读取跟更新是一个原子操作,没有更新的线程不会读取到数据,因为 status 已经改变 |
 | | 4 bug123 2024-03-13 13:02:54 +08:00 @ shakeyo 这种情况不应该是第二个线程阻塞等第一个线程 update 完吗? |