【问题标题】:Database level lock on mongodb?MongoDB上的数据库级锁?
【发布时间】:2013-10-12 03:15:26
【问题描述】:

我一定是错的。我正在考虑在我的项目中使用 mongodb,但我读到了这个:

http://docs.mongodb.org/manual/faq/concurrency/#what-type-of-locking-does-mongodb-use

上面说 mongodb 使用了数据库级别的读写锁。

MySQL InnoDB 使用行级锁定。嗯,这不是说,从理论上讲,mongodb 并发访问比 MySQL 慢 2 级吗?

【问题讨论】:

    标签: mongodb nosql


    【解决方案1】:

    如果您查看读写锁,您会发现它与 MySQL 在使用“行级锁定”一词时所指的数据库锁完全不同。

    Readers-writer lock 保护共享内存访问,因此寿命极短(大约为微秒)。由于在 MongoDB 中操作仅在文档级别上是原子操作,因此这些锁(在传统数据库中它们是 sometimes referred to as latches 并使用 to guard index access)仅在单个文档需要更新内存时才持有.

    常规的“数据库锁”通常会一直存在,直到正在进行的事务被提交或回滚。由于 RDBMS 事务可以跨越多个表的多个操作,因此这些锁的寿命通常要长得多,因此必须更加细化以允许其他工作发生并发。

    这不是说,从理论上讲,mongodb 在并发访问上比 MySQL 慢 2 级吗?

    不,它确实没有,并且取决于您的确切工作负载可能快得多或快一点或慢一点 - 这完全取决于您正在执行的操作类型、可用的物理资源、数据的结构,以及您的应用程序的需求。

    向 MongoDB 中的数据库写入大量数据的应用程序往往主要受到可用磁盘 IO 吞吐率的限制。只有当可用磁盘带宽超过应用程序对数据库的写入量时,您才会看到并发性成为 MongoDB 的一个因素。对于关系型数据库,由于锁的生命周期更长,即使写入的总数据量相对较少,并发性也可以更早地成为一个因素。

    【讨论】:

      【解决方案2】:

      是的,你完全正确,目前 MongoDB 实现了独占的 per-database write lock,从并发的角度来看,这比 MySQL 的 MyISAM 存储引擎的 per-table write lock 还要糟糕。

      来自here

      从 2.2 版开始,MongoDB 在每个数据库上实现锁 大多数读写操作的基础。

      在 2.2 版本之前情况更糟,因为它们对整个 mongod 实例使用一个全局锁。

      P.S.: 此外,MongoDB 使用内存映射文件,这些文件映射到虚拟内存(不是物理 RAM),并且每秒将数据刷新到磁盘(没有日志记录)。使用预写日志(日志),数据也不是持久的,因为组提交是在特定时间间隔内执行的。因此,我们同时接收到非持久存储和非内存存储。

      【讨论】:

      • 锁没有 MySQL 一样糟糕或更差,因为一​​个 MongoDB 锁是一个互斥锁,你的 ps 就像在常见的误解上被误导了
      • @Sammaye 你能更详细地解释一下区别吗?
      • 因为它不持有隔离锁,事实上它与锁的唯一相似之处是它在操作实际写入数据文件时持有它,不像 MySQL 持有隔离锁事务的持续时间,这是 ACID 中的 I,也是 MySQL 和其他 SQL 技术需要行级锁定的原因之一
      • @Sammaye 我不确定你是否清楚,也许你可以提供一些更详细解释的链接。我真的必须更深入地理解这个话题!..
      • 抱歉忘记了这个 convo,我有一个愚蠢的通用链接,但这里有一个可以帮助解释它的线程,但它又有点空洞:groups.google.com/forum/#!topic/mongodb-user/gCSkIgc6cbs,我从多篇文章中获得了我的知识在谷歌上基本上是通过搜索差异
      猜你喜欢
      • 1970-01-01
      • 2017-09-14
      • 1970-01-01
      • 2011-07-30
      • 2014-03-23
      • 2015-10-12
      • 1970-01-01
      • 1970-01-01
      • 2020-09-08
      相关资源
      最近更新 更多