在 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 Shell 中列出所有数据库
发布时间:2023/05/11 浏览次数:180 分类:MongoDB
-
交互式 Mongo Shell 提供了多个用于获取数据的选项。 本文介绍了在 Mongo Shell 中列出数据库的几种不同方法。
MongoDB 中检查字段包含的字符串
发布时间:2023/05/11 浏览次数:1024 分类:MongoDB
-
这篇文章解决了如何在 MongoDB 中使用正则表达式来确定字段是否包含字符串。在 MongoDB 中使用正则表达式 正则表达式 (regex) 是定义搜索模式的文本字符串。
在 MongoDB 中 upsert 更新插入
发布时间:2023/05/11 浏览次数:214 分类:MongoDB
-
在 MongoDB 中,upsert 结合了更新和插入命令。 它可以在 update() 和 findAndModify() 操作中使用。MongoDB 中的 upsert 查询 upsert 采用单个布尔参数。
如何卸载 MongoDB
发布时间:2023/05/11 浏览次数:745 分类:MongoDB
-
要从您的计算机中卸载 MongoDB,您必须先删除 MongoDB 服务、数据库和日志文件。使用这篇 MongoDB 文章,您将能够从 Ubuntu Linux、Mac 和 Windows 卸载 MongoDB。 请务必保留数据备份,因为一旦卸载,便
在 MongoDB 中存储日期和时间
发布时间:2023/05/11 浏览次数:762 分类:MongoDB
-
本 MongoDB 教程解释了 Date() 对象是什么以及如何使用 Date() 方法对集合进行排序。 这也将帮助您找到在 MongoDB 中显示和存储日期/时间的最佳方法。
MongoDB 按 ID 查找
发布时间:2023/05/11 浏览次数:1856 分类:MongoDB
-
MongoDB 中的 find by Id() 函数用于获取与用户提供的 id 相匹配的文档。 如果找不到与指定 ID 匹配的文档,则返回空值。
检查 MongoDB 服务器是否正在运行
发布时间:2023/05/11 浏览次数:247 分类:MongoDB
-
这篇 MongoDB 教程将告诉您如何检查是否安装了 MongoDB 以及安装的 MongoDB 服务器的版本。 它在 Windows、UBUNTU 和 MAC 等不同的操作系统中实现。
MongoDB 中的分页
发布时间:2023/05/11 浏览次数:174 分类:MongoDB
-
这篇文章将介绍什么是 MongoDB 中的分页。 为什么在 MongoDB 中需要分页以及在 MongoDB 中完成分页的不同方法或方式是什么。
MongoDB 从查询开始
发布时间:2023/05/11 浏览次数:186 分类:MongoDB
-
在这篇 MongoDB 文章中,用户将学习如何使用 $regex 进行开始查询。 它为查询中的模式匹配字符串提供正则表达式功能。