mongodb上的数据库级别锁定?

时间:2013-10-12 03:15:27

标签: mongodb nosql

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

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

它说mongodb使用数据库级读写器锁。

MySQL InnoDB使用行级锁定。嗯,这不意味着,从理论上讲,mongodb比并发访问的MySQL慢2级?

2 个答案:

答案 0 :(得分:10)

如果你查阅读者 - 作家锁,你会发现当你使用“行级别锁定”这个短语时,它是一种完全不同于动物的数据库锁而不是数据库锁。

Readers-writer lock保护共享内存访问,因此非常短暂(大约为微秒)。由于MongoDB操作在文档级别上只是原子操作,因此只要单个文档更新,这些锁定(在传统数据库中为sometimes referred to as latches且使用to guard index access)存储器

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

  

这不意味着,从理论上讲,mongodb比并发访问的MySQL慢2级?

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

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

答案 1 :(得分:-2)

是的,你是绝对正确的,目前MongoDB实现独占的每数据库写锁定,从并发的角度来看,比MySQL的MyISAM存储引擎的每表写锁更差。

来自here

  

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

直到2.2版本更糟糕,因为它们在整个mongod实例中使用了一个全局锁。

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