1

MoongoDB来自NoSql时代,Lock是和RDBMS有关的东西?来自维基百科

乐观并发控制(OCC)是一种用于关系数据库管理系统的并发控制方法...

那么为什么我在 PyMongo 中找到is_locked,甚至在进行非阻塞调用的驱动程序中,Lock 仍然存在,Motor 有is_locked

4

3 回答 3

3

NoSQL 并不意味着自动没有锁。总有一些操作需要锁。

例如建立索引

官方 MongoDB 文档是比维基百科更可靠的来源(无意冒犯维基百科 :))

http://docs.mongodb.org/manual/faq/concurrency/

于 2013-03-23T00:17:46.627 回答
2

Mongo 进行就地更新,因此它需要锁定才能修改数据库。还有其他需要锁定的东西,因此请阅读@Tigra 提供的链接以获取更多信息。

就数据库而言,这是非常标准的,它不是特定于 RDBMS 的东西(Redis 也这样做,但基于每个键)。

有计划实施集合级(而不是数据库级)锁定:https ://jira.mongodb.org/browse/SERVER-1240

一些数据库,如 CouchDB,通过仅附加新文档来解决锁定问题。他们创建一个新的、唯一的修​​订 ID,一旦文档完成写入,数据库就会指向新的修订。我确信在更改使用的修订版时会有某种并发控制,但它不需要阻止数据库来做到这一点。这有一些缺点,例如需要定期运行压缩。

于 2013-03-23T00:26:16.843 回答
1

MongoDB 实现了数据库级别的锁定系统。这意味着非原子操作将锁定在每个数据库级别上,这与大多数技术人员锁定在表级别以进行基本操作的 SQL 不同。

就地更新仅发生在某些运算符上——$set作为其中之一,MongoDB 文档确实曾经有一个页面显示所有这些,但我现在找不到它。

MongoDB 目前实现了一个读/写锁,每个锁都是独立的,但它们可以相互阻塞。

锁对任何数据库都至关重要,例如,如果当前正在写入文档,如何确保对文档的一致读取?如果您写入文档,您如何确保一次只应用单个更新而不是同时应用多个更新?

我不确定版本控制如何在 CouchDB 中阻止这种情况,锁对于一致读取非常重要,并且与版本控制分开,即如果您希望将读取锁应用于同一版本或读取当前正在执行的文档怎么办写入新版本?您显然会看到一个锁定队列出现。即使版本控制可能对写锁饱和有一点帮助,仍然会有一个写锁,它仍然需要在一个级别上工作。

至于并发特性;如果数据不在 RAM 中,MongoDB 有能力(一方面)为其他操作消退一个操作。这意味着锁不会只是坐在那里等待数据被调入,同时其他操作也会运行。

附带说明一下,MongoDB 实际上有比这更多的锁,它还有一个全局和阻塞的 JavaScript 锁,它没有常规锁的正常并发特性。

甚至在进行非阻塞调用的驱动程序中

嗯,我认为您可能会对“非阻塞”应用程序或服务器的含义感到困惑:http ://en.wikipedia.org/wiki/Non-blocking_algorithm

于 2013-03-23T10:00:35.347 回答