请教一个 mongodb 的问题

2022-10-09 15:01:22 +08:00
 dumbbell5kg
这是我的 document:

{"pinyinOfName" : [
"MUBANXIANGMU",
"MBXM"
]
}

操作:
1 、一个 findAndModify 去 pull 第一条记录"MUBANXIANGMU"
2 、另一个 findAndModify 去 pull 第二条记录"MBXM"

问题:
1 和 2 同时执行,会不会出现这种情况:1 的结果返回了"MBXM",2 的结果返回了"MUBANXIANGMU"?
如果不会,又是为什么呢,求大佬抬一下
1157 次点击
所在节点    程序员
7 条回复
sunkai0609
2022-10-09 15:05:28 +08:00
mongodb 单文档操作应该是原子的吧
dumbbell5kg
2022-10-09 15:17:02 +08:00
@sunkai0609 我理解单文档的原子性是指,一条语句更新多个字段,要么字段都更新成功,要么都更新失败,不太清楚原子性和问题有什么关系
sunkai0609
2022-10-09 15:36:55 +08:00
@dumbbell5kg 额,就是即使你并发请求,在 mongodb 处理时可以看做是顺序执行的。我是这么认为的,不保真。。
leopod1995
2022-10-09 16:00:48 +08:00
不会。
首先"并发"是一个宏观概念上的并发,在底层执行一定是有序执行。在 mongodb 层面,每个 op 都有自己的时间戳,用来保证事务的执行顺序。所以结果是 1/2 任意一条先执行,返回包含 2 条记录的数组的原文档,然后第二个 op 返回包含 1 条记录的新文档。
When modifying a single document, both db.collection.findAndModify() and the updateOne() method atomically update the document 。
dumbbell5kg
2022-10-09 17:00:47 +08:00
@leopod1995 查了一个多小时的文档,我现在理解 mongo 是用锁来保证原子性的,既然有锁,那么 findAndModify 一定是顺序执行的
dumbbell5kg
2022-10-09 17:01:12 +08:00
感谢大佬们
dumbbell5kg
2022-10-09 17:02:39 +08:00
@leopod1995 另外其实我是想用 findAndModify 返回更新后的结果的,所以才问了这个问题

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

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

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

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

© 2021 V2EX