当前位置: 首页 > 知识库问答 >
问题:

MongoDB将写入锁定到什么级别?(或者:“每个连接”是什么意思

慕迪
2023-03-14

在mongodb文档中,它说:

从版本2.2开始,MongoDB在每个数据库的基础上为大多数读写操作实现锁。一些全局操作(通常是涉及多个数据库的短期操作)仍然需要全局“实例”范围的锁。在2.2之前,每个mongod实例只有一个“全局”锁。

这是否意味着在我有3个连接到网络上运行的不同应用程序的mongodb://localhost/test的情况下——一次只能写一个?还是只是每个连接?

IOW:它是每个连接,还是整个 /test数据库在写入时被锁定?

共有3个答案

黄弘盛
2023-03-14

Mongo 3.0现在支持收集级锁定。

除此之外,现在Mongo还创建了一个允许创建存储引擎的API。Mongo 3.0配备了2个存储引擎:

  1. MMAPv1:默认存储引擎和以前版本中使用的存储引擎。带有集合级锁定
  2. WiredTiger:新的存储引擎,带有文档级锁定和压缩。(仅适用于64位版本)

MongoDB 3.0发布说明

连线老虎

孟雪风
2023-03-14

它不是每个连接,而是每个mongod。换句话说,锁将存在于该服务器上test数据库的所有连接中。

它也是一个读/写锁,所以如果发生写入,那么读取必须等待,否则MongoDB怎么知道它是一致读取?

然而,我应该提到,MongoDB锁与您获得的SQL/普通事务锁非常不同,通常在平均更新之间锁会保持大约一微秒。

谷梁云瀚
2023-03-14

MongoDB中的锁定与RDBMS中的锁定不同,因此需要进行一些解释。在早期版本的MongoDB中,只有一个全局读写器闩锁。从MongoDB 2.2开始,每个数据库都有一个读写器闩锁。

闩锁是多个读卡器、单个写卡器,并且是写卡器贪婪的。这意味着:

  • 一个数据库上可以有无限数量的同时读卡器

请注意,我称之为“闩锁”,而不是“锁”。这是因为它是轻量级的,并且在正确设计的模式中,写锁保持在十几微秒左右。有关读者-作者锁定的更多信息,请参阅此处。

在MongoDB中,您可以同时运行任意多个查询:只要相关数据在RAM中,它们都会得到满足,而不会发生锁定冲突。

回想一下,在MongoDB中,事务级别是单个文档。对单个文档的所有更新都是原子的。MongoDB实现这一点的方法是,只在RAM中更新单个文档所需的时间内保持写锁存。如果有任何运行缓慢的操作(特别是,如果需要从磁盘分页文档或索引项),则该操作将产生写锁存。当操作产生闩锁时,下一个排队操作可以继续。

这确实意味着对单个数据库中所有文档的写入都会被序列化。如果您的模式设计很差,并且写操作需要很长时间,那么这可能会成为一个问题,但是在正确设计的模式中,锁定不是问题。

关于作家贪婪的几句话:

一次只能有一个写入器持有闩锁;一次可以有多个读取器持有闩锁。在一个天真的实现中,如果只有一个读者在操作,作者可能会无限期地挨饿。为了避免这种情况,在MongoDB实现中,一旦任何一个线程对特定的锁存器发出写请求

  • 需要该闩锁的所有后续读卡器都将阻塞
  • 该作者将等待当前所有读者完成
  • 写入程序将获取写闩锁,执行其工作,然后释放写闩锁
  • 所有排队的读卡器现在都将继续

实际的行为是复杂的,因为作者的贪婪行为与屈服之间的相互作用是不明显的。回想一下,从2.2版开始,每个数据库都有一个单独的锁存器,因此写入数据库“a”中的任何集合都将获得一个单独的锁存器,而不是写入数据库“B”中的任何集合。

关于具体问题:

  • 锁(实际上是锁存)仅在更新单个文档时由MongoDB内核持有

虽然这听起来像是一个很大的性能问题,但实际上它并不会减缓事情的发展。有了正确设计的模式和典型的工作负载,MongoDB将在任何数据库的锁定百分比超过50%之前饱和磁盘I/O容量——即使是固态硬盘。

据我所知,目前容量最高的MongoDB集群每秒执行200万次写入。

 类似资料:
  • 问题内容: 假设我们在A包中有A类,在B包中有B类。如果类A的对象引用了类B,则称这两个类在它们之间具有耦合。 为了解决这种耦合,建议在包A中定义一个接口,该接口由包B中的类实现。然后,类A的对象可以引用包A中的接口。这通常是“依赖倒置”的一个例子。 这是“在接口级别将两个类解耦”的示例。如果是,当两个类耦合时,它如何消除类之间的耦合并保持相同的功能? 问题答案: 让我们创建一个虚拟的例子。 套餐

  • 问题内容: 我一直在研究Java多线程概念。我越经历他们,我就越困惑。 现在,我还不了解Java中的类级别,对象级别,显式和固有锁定之间的区别。有人可以让我知道这是什么吗?另外,如果我可以理解一些示例,那对我也将非常有帮助。 问题答案: 显式与内在 当您在对象上使用或间接用作方法签名的一部分时,您正在创建内部锁。您依赖与所有对象和类关联的内置锁。 软件包中的Java 5+提供了显式锁。最常用的类可

  • 我一直在研究Java多线程概念。我看得越多,就越困惑。 现在我不明白Java中类级别、对象级别、显式锁定和内在锁定之间的区别。有人能告诉我是什么吗?此外,如果我能得到一些例子来理解,那将对我很有帮助。

  • 在这段代码中,两个连接和断开是什么意思?导致停止,直到终止?

  • 这点我见过提过几次,但我不清楚是甚么意思。你什么时候为什么要这么做? 我知道接口是做什么的,但我不清楚这一点的事实使我认为我错过了正确使用它们。 如果你要做: 您可以使用任何实现的类?你什么时候需要这么做?我唯一能想到的是,如果您有一个方法,但您不确定会传递什么对象,除了它实现。我想不出你需要多长时间这样做一次。 另外,如何编写一个方法来接受一个实现接口的对象呢?有可能吗?

  • 本文向大家介绍什么是锁?相关面试题,主要包含被问及什么是锁?时的应答技巧和注意事项,需要的朋友参考一下 数据库是一个多用户使用的共享资源。当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。 加锁是实现数据库并发控制的一个非常重要的技术。当事务在对某个数据对象进行操作前,先向系统发出请求,对其加锁。加