在 MongoDB 中的锁机制
在数据库管理系统中,锁定机制确保了整个结果的一致性。
例如,如果对数据进行了某些写入过程,则不能同时执行读取命令。 数据库资源被锁定,以防止此类情况导致的数据不准确。
MongoDB 还使用锁定来确保数据一致性,因为多个客户端可以同时访问或修改相同的数据。 在本文中,我们将解释 MongoDB 中锁定的概念。
在 MongoDB 中锁定
MongoDB 中的锁定与其他关系数据库管理系统中的锁定不同。 让我们向您描述锁定在 MongoDB 中是如何工作的。
MongoDB 使用多粒度锁定。 这意味着可以在全局、数据库或集合级别甚至单个存储引擎的文档级别锁定进程。
这些级别的锁定将在本文中进一步描述。 在最新版本的 MongoDB 中,从 v2.2 开始,每个数据库都有一个读写器锁存器。
由于这些读取器/写入器锁存器,可以并发访问数据库资源。 让我们解释一下这些是如何工作的。
Reader/Writer 锁存器
MongoDB 的读/写锁存器可以最好地解释为具有以下属性:
- 它是一个多阅读器。 这意味着任何数量的读者都可以同时访问集合而不会影响数据的一致性,因为数据不会被修改,只会被读取。
- 这是一个单一的Writer。 这意味着一次只能有一个写入器以确保数据的一致性。
-
这是贪婪的Writer。 Writer贪婪意味着Writer优先于Reader。
因此,如果写入者请求使用数据库,所有传入的读取器都会被暂时阻止(或锁定),直到他们完成工作。
然而,Writer一直等到当前读者离开。 此实现可防止编写器无限期地挨饿。
由于 MongoDB 中存在这个闩锁,任何并发查询都可以在没有主要锁定冲突的情况下执行。
在这里,writer latch 变得很有趣,因为在 MongoDB 中,每个将操作写入单个文档的人都被认为是原子的。 由于写入操作是原子的,写入器锁存器仅在更新单个文档所需的时间内由 MongoDB 内核持有。
因此,如果执行了一个运行缓慢的写操作(例如,由于模式设计不佳或从磁盘分页文档),则称它已产生闩锁。
另一件需要注意的事情是,如前所述,MongoDB 为每个数据库都有一个单独的读取器/写入器锁存器。 为了解释这一点,假设我们有两个数据库,A 和 B。
对于数据库 A 中的写操作,与数据库 B 中的写操作相比,写入器将获得一个单独的闩锁。
类似地,如果与数据库的多个连接同时执行写操作,则锁存器将在每个数据库的基础上保持。 此外,这些同时连接将交错。
因此,我们说 MongoDB 中的锁定不是每个连接。 相反,它是每个mongod。
mongod是指MongoDB系统的主要后台进程,负责管理数据请求、数据访问等后台操作。
MongoDB 中的锁定级别
在 MongoDB 中,有四个级别的锁定:
- 全局级锁定:这也称为实例级锁定。 这意味着所有数据库都将被锁定。
- 数据库级锁定:只有指定的数据库才会在这种类型的锁定中被锁定。
- 集合级锁:在MongoDB中,集合是一组相关的文档(类似于传统RDBMS中的表)。 集合级锁定句柄锁定单个集合。
- 文档级锁定:MongoDB 中的文档可以称为具有字段和值对的记录。 这种类型的锁定仅锁定特定文档。
MongoDB 中的锁定模式
在 MongoDB 中,有四种锁模式,解释如下。
-
R:这代表共享 (S) 锁。
这种锁定方式用于读者。资源将在读者之间共享,在此模式下并发访问它们。
-
W:这代表一个独占 (X) 锁。
这种锁定模式用于写入器。
在这种模式下,资源将不可用于任何其他并发读取器或写入器。
-
r:这代表一个意向共享 (IS) 锁。
它是一个更高级别的意向锁。在移动到较低级别的锁之前获取此类锁。
例如,如果在数据库级别获取了 r 锁,则意味着现在可以在集合和文档(较低)级别获取 R 锁。
- w:这表示意向排他 (IX) 锁。 它也是一个更高级别的意向锁。
与 r 锁的工作方式类似,如果在数据库级别获取 w 锁,则意味着现在可以在集合和文档(较低)级别获取 W 锁。
检查 MongoDB 中的锁定状态
那么,有没有办法检查 mongod 实例上锁的状态? 是的,您可以使用以下方法这样做:
db.serverStatus()
您可以使用此方法来监控各个级别的锁,例如:
-
对于全局级别,使用此代码
db.serverStatus().globalLock
。 -
对于数据库级别,使用此代码
db.serverStatus().locks.Database
。 -
对于集合级别,使用此代码
db.serverStatus().locks.Collection
。 -
要监控 oplog(操作日志)中的锁,请使用此代码
db.serverStatus().locks.oplog
。
您还可以使用以下方法:
db.currentOp()
总结
本文解释了 MongoDB 中锁定的概念,以及它的各种级别和模式。 我们希望您能够掌握这些概念。
相关文章
比较 MongoDB 中的字段
发布时间:2023/04/21 浏览次数:51 分类:MongoDB
-
在本文中,我们将了解如何比较 MongoDB 中的两个字段。 此外,我们将看到一个相关的示例和解释,以使主题更容易理解。
清除或删除 MongoDB 中的集合
发布时间:2023/04/21 浏览次数:147 分类:MongoDB
-
本篇文章将告诉大家如何删除 MongoDB 数据库中的集合以及删除 MongoDB 中的集合的不同方法。
向 MongoDB 集合中的每个文档添加新字段
发布时间:2023/04/21 浏览次数:107 分类:MongoDB
-
您将在这篇文章中了解 $set 和 $setOnInsert 操作。 此外,利用这两个运算符,快速描述了向 MongoDB 中的集合添加字段的挑战。
MongoDB 截断集合
发布时间:2023/04/21 浏览次数:178 分类:MongoDB
-
可以根据需要选择两个选项之一来截断下面的集合。 在今天的文章中,我们将学习如何在 MongoDB 中截断集合。
删除 MongoDB 中的重复项
发布时间:2023/04/21 浏览次数:151 分类:MongoDB
-
在本文中,我们将了解如何删除 MongoDB 中的重复条目,并且我们还将看到一个带有适当解释的示例,以使主题更容易理解。
使用 NodeJS 检查 MongoDB 中是否存在集合
发布时间:2023/04/21 浏览次数:194 分类:MongoDB
-
在本文中,我们将检查 MongoDB 数据库中是否存在一个集合,并且我们还将查看与主题相关的示例,以使主题更容易理解。 为此,我们将使用 Node.js。
MongoDB 中的唯一索引
发布时间:2023/04/21 浏览次数:144 分类:MongoDB
-
在这篇教学文章中,您将了解唯一索引、它们是什么以及如何在 MongoDB 中使索引唯一。 此外,还简要详细地解释了使用户的电子邮件在 MongoDB 中唯一。
在 MongoDB 中创建索引
发布时间:2023/04/21 浏览次数:104 分类:MongoDB
-
索引有助于有效解决查询。 如果没有索引,MongoDB 必须遍历集合中的每个文档才能找到与查询匹配的文档。因此,在今天的文章中,我们将学习如何在 MongoDB 中创建索引。
MongoDB 中的稀疏索引
发布时间:2023/04/21 浏览次数:142 分类:MongoDB
-
在本文中,我们将讨论 MongoDB 中的稀疏索引。 此外,我们将提供一个相关示例并进行解释,以使该主题更容易理解。