在mongodb文档中,它说:
从版本2.2开始,MongoDB在每个数据库的基础上为大多数读写操作实现锁。一些全局操作(通常是涉及多个数据库的短期操作)仍然需要全局“实例”范围的锁。在2.2之前,每个mongod实例只有一个“全局”锁。
这是否意味着在我有3个连接到网络上运行的不同应用程序的mongodb://localhost/test的情况下——一次只能写一个?还是只是每个连接?
IOW:它是每个连接,还是整个 /test数据库在写入时被锁定?
Mongo 3.0现在支持收集级锁定。
除此之外,现在Mongo还创建了一个允许创建存储引擎的API。Mongo 3.0配备了2个存储引擎:
MongoDB 3.0发布说明
连线老虎
它不是每个连接,而是每个mongod
。换句话说,锁将存在于该服务器上test
数据库的所有连接中。
它也是一个读/写锁,所以如果发生写入,那么读取必须等待,否则MongoDB怎么知道它是一致读取?
然而,我应该提到,MongoDB锁与您获得的SQL/普通事务锁非常不同,通常在平均更新之间锁会保持大约一微秒。
MongoDB中的锁定与RDBMS中的锁定不同,因此需要进行一些解释。在早期版本的MongoDB中,只有一个全局读写器闩锁。从MongoDB 2.2开始,每个数据库都有一个读写器闩锁。
闩锁是多个读卡器、单个写卡器,并且是写卡器贪婪的。这意味着:
请注意,我称之为“闩锁”,而不是“锁”。这是因为它是轻量级的,并且在正确设计的模式中,写锁保持在十几微秒左右。有关读者-作者锁定的更多信息,请参阅此处。
在MongoDB中,您可以同时运行任意多个查询:只要相关数据在RAM中,它们都会得到满足,而不会发生锁定冲突。
回想一下,在MongoDB中,事务级别是单个文档。对单个文档的所有更新都是原子的。MongoDB实现这一点的方法是,只在RAM中更新单个文档所需的时间内保持写锁存。如果有任何运行缓慢的操作(特别是,如果需要从磁盘分页文档或索引项),则该操作将产生写锁存。当操作产生闩锁时,下一个排队操作可以继续。
这确实意味着对单个数据库中所有文档的写入都会被序列化。如果您的模式设计很差,并且写操作需要很长时间,那么这可能会成为一个问题,但是在正确设计的模式中,锁定不是问题。
关于作家贪婪的几句话:
一次只能有一个写入器持有闩锁;一次可以有多个读取器持有闩锁。在一个天真的实现中,如果只有一个读者在操作,作者可能会无限期地挨饿。为了避免这种情况,在MongoDB实现中,一旦任何一个线程对特定的锁存器发出写请求
实际的行为是复杂的,因为作者的贪婪行为与屈服之间的相互作用是不明显的。回想一下,从2.2版开始,每个数据库都有一个单独的锁存器,因此写入数据库“a”中的任何集合都将获得一个单独的锁存器,而不是写入数据库“B”中的任何集合。
关于具体问题:
虽然这听起来像是一个很大的性能问题,但实际上它并不会减缓事情的发展。有了正确设计的模式和典型的工作负载,MongoDB将在任何数据库的锁定百分比超过50%之前饱和磁盘I/O容量——即使是固态硬盘。
据我所知,目前容量最高的MongoDB集群每秒执行200万次写入。
问题内容: 假设我们在A包中有A类,在B包中有B类。如果类A的对象引用了类B,则称这两个类在它们之间具有耦合。 为了解决这种耦合,建议在包A中定义一个接口,该接口由包B中的类实现。然后,类A的对象可以引用包A中的接口。这通常是“依赖倒置”的一个例子。 这是“在接口级别将两个类解耦”的示例。如果是,当两个类耦合时,它如何消除类之间的耦合并保持相同的功能? 问题答案: 让我们创建一个虚拟的例子。 套餐
问题内容: 我一直在研究Java多线程概念。我越经历他们,我就越困惑。 现在,我还不了解Java中的类级别,对象级别,显式和固有锁定之间的区别。有人可以让我知道这是什么吗?另外,如果我可以理解一些示例,那对我也将非常有帮助。 问题答案: 显式与内在 当您在对象上使用或间接用作方法签名的一部分时,您正在创建内部锁。您依赖与所有对象和类关联的内置锁。 软件包中的Java 5+提供了显式锁。最常用的类可
我一直在研究Java多线程概念。我看得越多,就越困惑。 现在我不明白Java中类级别、对象级别、显式锁定和内在锁定之间的区别。有人能告诉我是什么吗?此外,如果我能得到一些例子来理解,那将对我很有帮助。
在这段代码中,两个连接和断开是什么意思?导致停止,直到终止?
这点我见过提过几次,但我不清楚是甚么意思。你什么时候为什么要这么做? 我知道接口是做什么的,但我不清楚这一点的事实使我认为我错过了正确使用它们。 如果你要做: 您可以使用任何实现的类?你什么时候需要这么做?我唯一能想到的是,如果您有一个方法,但您不确定会传递什么对象,除了它实现。我想不出你需要多长时间这样做一次。 另外,如何编写一个方法来接受一个实现接口的对象呢?有可能吗?
本文向大家介绍什么是锁?相关面试题,主要包含被问及什么是锁?时的应答技巧和注意事项,需要的朋友参考一下 数据库是一个多用户使用的共享资源。当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。 加锁是实现数据库并发控制的一个非常重要的技术。当事务在对某个数据对象进行操作前,先向系统发出请求,对其加锁。加