MongoDB如何处理并发更新?

34

我在工作中开始使用MongoDB,目前为止一切都很好。然而,我想知道MongoDB如何处理并发更新?我已经阅读过MongoDB没有锁定功能的相关信息,所以我想知道一般处理这个问题的常见做法是什么。

谢谢。


3
https://dev59.com/nqvka4cB1Zd3GeqPqUEr#50262110 解释了WiredTiger(当前)的并发处理方法。 - Asya Kamsky
2个回答

51

MongoDB使用进程级别的写锁来保证同一时间只能执行一个写入操作(更新/插入/删除)。因此,它自动解决了并发问题,因为不允许写入并发。

如果4个线程尝试进行更新操作,其中一个将获取写锁,完成其更新并释放锁。然后剩下的3个线程中的另一个将获取锁并继续其更新操作,以此类推。

仅当您的操作无法包装在单个写入操作中时,并发才会发挥作用。请注意,在最常见的用例(查找文档、更新文档并原子地抓取新版本)中,MongoDB提供了“findAndModify”命令,该命令正是针对此目的而设计的:http://www.mongodb.org/display/DOCS/findAndModify+Command

更新:现在锁定更加细粒度化。


谢谢,我确实明白为什么它似乎是常识。 - lollancf37
1
不用谢。它似乎是一项限制功能,但由于写入相对较快,实际上很少会出现性能问题。请关注mongostat中的“locked%”,以查看锁定时间的占比。 - Remon van Vliet
2
MongoDB 3.2及以上版本默认使用WiredTiger存储引擎,它支持文档级别的写操作锁定。详情请参考:https://docs.mongodb.com/manual/core/wiredtiger/#storage-wiredtiger。 - Suraj
1
这个答案特别适用于WT,并且解释得很好。https://dev59.com/nqvka4cB1Zd3GeqPqUEr#50262110 - Asya Kamsky

8

使用修改器操作

$inc $set $unset $push $pushAll $addToSet $pop $pull $pullAll $rename $bit

它们都是原子操作。


谢谢指出这篇文章,但它似乎并不能保证你是唯一可以写入特定集合的人,对吧? - lollancf37
4
只要你使用修饰符操作,无论你有多少并发写入,都没有关系。 - Karoly Horvath

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接