【问题标题】:Why using Locking in MongoDB?为什么在 MongoDB 中使用锁定?
【发布时间】:2013-03-23 00:15:48
【问题描述】:

MoongoDB是NoSql时代的,Lock是和RDBMS有关的东西? from Wikipedia:

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

的并发控制方法

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

【问题讨论】:

    标签: mongodb pymongo database-locking


    【解决方案1】:

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

    例如建立索引

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

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

    【讨论】:

    • 复制集似乎变得更复杂了!
    • 在RDBMS中一致性是由锁管理的,所以这里的一致性只针对索引?
    • 所以即使在NoSql中也存在乐观和悲观并发,但是每个DBMS都有自己的策略
    【解决方案2】:

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

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

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

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

    【讨论】:

    • 所以每个 DBMS 都有自己的技术来减少锁定?
    • @AbdelouahabPp - 我不是数据库专家,但这似乎取决于数据库的实现方式。锁定通常是保证更快查询(慢写与慢读)的权衡。询问dba.stackexchange.com 以获得专家见解。
    【解决方案3】:

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

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

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

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

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

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

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

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

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

    【讨论】:

    • sorry但是我不关注非阻塞和锁定数据库,当数据库锁定自己时,非阻塞没有用吗?
    • @AbdelouahabPp 非阻塞是应用程序/服务器的一个特性,它不是无用的,因为它关心应用程序如何运行以及它如何处理自己的数据。嗯,想象一下两个 PHP 进程竞争同一个脚本,即使你没有看到它,在启动已经运行的新脚本时会有轻微的“锁定”延迟,在非阻塞应用程序中,这不会以这种情况为例
    • 所以我猜如果 process1 尝试进行 DB 调用并发现 mongodb 被锁定,它会立即说:嘿,process2,现在轮到你尝试了吗?
    • @AbdelouahabPp 取决于语言,但技术上是的,或者更确切地说,所有进程将立即发送到数据库,mongodb 将通过其并发特性对请求进行自己的内部改组。
    • @AbdelouahabPp 我相信是这样,理论上,我必须承认我没有使用过龙卷风、蟒蛇或马达,所以我在这里猜测了一下,但非阻塞的性质应该在那里成立。
    猜你喜欢
    • 1970-01-01
    • 2011-12-12
    • 2021-10-25
    • 1970-01-01
    • 2011-12-05
    • 2011-08-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多