【发布时间】:2016-11-21 08:29:15
【问题描述】:
我是 MongoDB 数据库的新手,我的一个应用程序计划将其中的一部分迁移到 MongoDB。我们需要处理乐观并发的地方。 MongoDB 的最佳实践是什么。
对于需要并发的应用来说,MongoDB 是正确的选择吗?
【问题讨论】:
标签: mongodb concurrency
我是 MongoDB 数据库的新手,我的一个应用程序计划将其中的一部分迁移到 MongoDB。我们需要处理乐观并发的地方。 MongoDB 的最佳实践是什么。
对于需要并发的应用来说,MongoDB 是正确的选择吗?
【问题讨论】:
标签: mongodb concurrency
是的,MongoDB 将是并发的正确选择。
MongoDB 锁定不同于 RDBMS 中的锁定。
MongoDB 使用多粒度锁定(参见有线老虎),允许操作在全局、数据库或集合级别锁定,并允许各个存储引擎在集合级别以下(例如,在文档中)实现自己的并发控制- 级别的 WiredTiger)。
MongoDB 使用读写锁,允许并发读者共享访问资源,例如数据库或集合,但在 MMAPv1 中,对单个写入操作提供独占访问权限。
WiredTiger 使用乐观并发控制。 WiredTiger 仅在全局、数据库和集合级别使用意图锁。当存储引擎检测到两个操作之间的冲突时,会引发写入冲突,导致 MongoDB 透明地重试该操作。
MongoDB 对每个数据库都有一个读/写锁存器。
latch 是多读单写的,而且是写贪婪的,所以我们可以在一个数据库上同时拥有无限数量的读, 但是在任何一个数据库中的任何集合上一次只能有一个作家。
“writer-greedy”,优先写,所以当我们得到一个写请求时,所有的读请求都被阻塞,直到写完成。
这里的锁被称为闩锁,因为它比锁更轻,并且可以在几微秒内完成工作。
MongoDB 能够同时运行尽可能多的查询。
希望对你有帮助!!
参考文献
https://docs.mongodb.com/manual/faq/concurrency/
https://docs.mongodb.com/manual/reference/command/findAndModify/
【讨论】: