MongoDB 的 findOneAndUpdate 并发问题

58 天前
 Grand
MongoDB 有一个 Document ,它的 Schema 如下
{
"_id": ObjectId // 主键
"status": String
}
数据库里面有一条数据
{
"_id": 1,
"status": "waiting"
}
现在两个线程 A,B ,线程 A 和 B 并发执行 findOneAndUpdate({"_id": "1", "status": "waiting"}, {$set: { "status": "running"}})
虽然 findOneAndUpdate 是原子操作,但是有没有可能同时查找出该文档。
879 次点击
所在节点    MongoDB
4 条回复
zhangqian99
58 天前
虽然两个线程同时尝试执行 findOneAndUpdate 操作,因为操作的原子性,只有一个线程能成功更新文档。虽然条件相同,另一个线程会找不到匹配的文档来更新
cyhulk
58 天前
@zhangqian99 他的问题是 find 并发的时候能不能读到,感觉可以读到但是更新不了,没有 mysql 的那些事务隔离吧
shakeyo
58 天前
可以读到但更新不了,读取跟更新是一个原子操作,没有更新的线程不会读取到数据,因为 status 已经改变
bug123
57 天前
@shakeyo 这种情况不应该是第二个线程阻塞等第一个线程 update 完吗?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1022890

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX