添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
MongoDB-CN-Manual
搜索
K
Comment on page

FAQ: MongoDB并发

在本页面
MongoDB允许多个客户端读取和写入相同的数据。为了确保一致性,它使用锁定和其他 并发控制 措施来防止多个客户端同时修改同一数据。这些机制共同保证了对单个文档的所有写入全部发生或完全不发生,并且客户端永远不会看到不一致的数据视图。

MongoDB使用哪种类型的锁定?

MongoDB使用多粒度锁定 [1] ,它允许操作锁定在全局,数据库或集合级别,并允许各个存储引擎在集合级别以下实现自己的并发控制(例如,在WiredTiger中的文档级别)。
MongoDB使用读-写锁,允许并发的读写操作以共享的方式访 问资源(例如数据库或集合)。
除了用于读取的共享(S)锁定模式和用于写操作的排他(X)锁定模式之外,意向共享(IS)和意向排他(IX)模式还表明使用更精细的锁定粒度来读取或写入资源的意图 。当以一定的粒度锁定时,所有更高级别的锁定都使用 意向锁来锁定
例如,当锁定用于写的集合(使用排它X锁定模式)时,必须同时在意向排他(IX)锁定模式下锁定相应的数据库锁和全局锁。单个数据库可以同时在IS和IX模式下锁定,但是独占(X)锁不能与任何其他模式共存,共享(S)锁只能与意向共享(IS)锁共存。
锁是公平的,读取和写入按顺序排队。但是,为了优化吞吐量,当一个请求被授予时,所有其他兼容请求将同时被授予,从而有可能在冲突请求之前释放它们。例如,考虑X锁(排它锁)被释放的情况,并且冲突队列包含以下各项:
IS → IS → X → X → S → IS
在严格的先进先出(FIFO)顺序中,将仅授予前两个IS模式。相反,MongoDB实际上将授予所有IS和S模式,一旦它们全部完成,它将授予X,即使在此期间新的IS或S请求已进入排队。由于授予将始终将所有其他请求移到队列中,因此任何请求都不会存在饿死等待问题。
db.serverStatus() db.currentOp() 输出中,锁定模式表示如下:
锁模式
Description
R
代表共享锁(S)
W
代表排它锁(X)
r
代表意向共享锁 (IS)
w
代表意向排它锁 (IX)
[1]
有关更多信息,请参见Wikipedia页面上的 多粒度锁定

MongoDB中锁的粒度有多细?

对于大多数读取和写入操作,WiredTiger使用乐观并发控制。WiredTiger仅在全局,数据库和集合级别使用意向锁。当存储引擎检测到两个操作之间存在冲突时,将引发写冲突,从而导致MongoDB对用户而言透明地重试该操作。
一些全局操作(通常是涉及多个数据库的短暂操作)仍然需要全局“实例范围”锁定。其他一些操作(如 collMod )仍需要排他数据库锁。

如何查看 mongod 实例上的锁状态?

要报告有关锁的锁使用率信息,请使用以下任何一种方法:
具体而言, serverStatus输出中 locks 文档或 当前操作报告中 的字段可提供有关 mongod 实例中锁的类型和锁争用的数量。
db.serverStatus() db.currentOp() 输出中,锁定模式表示如下:
锁定模式
描述
R
表示共享(S)锁。
W
表示排他(X)锁。
r
表示共享意图(IS)锁。
w
表示意向排他(IX)锁。
要终止操作,请使用 db.killOp()

读或写操作是否会产生锁定?

在某些情况下,读和写操作可以产生它持有的锁。
长时间运行的读写操作(例如查询,更新和删除)在许多情况下都会产生。MongoDB如果单个修改文档的操作,影响带有 multi 参数修改多个文档 update() 操作,MongoDB也会产生锁定。
对于支持文档级 并发控制的 存储引擎(例如 WiredTiger) ,当使用意向锁访问存储时不需要锁定,因为该锁是数据库和集合级别的全局锁定,不会阻塞其他读取和写入操作。但是,操作将定期产生锁定,例如:
  • 避免长时间执行的存储性事务,因为这些事务可能需要在内存中保存大量数据;
  • 作为中断响应点(interruption points),以便您可以取消长时间运行的操作;
  • 允许需要排他访问集合的操作,例如索引/集合删除和创建。

一些常见的客户端操作会采取什么锁定?

下表列出了一些操作以及它们用于文档级锁定存储引擎的锁定类型:
操作
数据库
集合级别锁
发出查询
r (意向共享)
r (意向共享)
插入资料
w (意向排他)
w (意向排他)
删除资料
w (意向排他)
w (意向排他)
更新数据
w (意向排他)
w (意向排他)
执行聚合操作
r (意向共享)
r (意向共享)
创建索引(前台)
W (排他)
创建索引(后台)
w (意向排他)
w (意向排他)
列出集合列表
r (意向共享) 在版本4.0中更改。
映射减少操作
W (排他)和 R (共享)
w (意向排他)和 r (意向共享)

哪些管理命令可以锁定数据库?

某些管理命令可以较长时间排他锁定数据库。在某些部署中,对于大型数据库,您可以考虑使 mongod 实例脱机,以便客户端不受影响。例如,如果 mongod 副本集的 一部分,请执行 mongod 脱机操作,让集合服务的其他成员请求负载。
以下管理操作需要在数据库级别上长时间进行排他锁定:
运作方式
方法
collMod
compact
renameCollection db.collection.renameCollection()
_在版本4.2中进行了更改。 如果在同一数据库中重命名集合,则该操作将对源集合和目标集合进行排他(W)锁定。在MongoDB 4.2之前的版本中,在同一数据库中重命名时,该操作将对数据库使用排他(W)锁。(仅)如果目标名称空间与源集合位于不同的数据库中,则锁定行为取决于版本: renameCollection (MongoDB 4.2.2和更高版本) 在跨数据库重命名集合时,该操作在目标数据库上获得排他(W)锁,并阻塞该数据库上的其他操作,直到操作完成。 (MongoDB 4.2.1和更早版本)_在跨数据库重命名集合时,该操作采用全局排他(W)锁,并阻止其他操作,直到操作完成。
以下管理操作将锁定数据库,但仅在很短的时间内保持锁定:
运作方式
方法
authenticate db.auth()
也可以看看

哪些管理命令可以锁定集合?

在版本4.2中进行了更改。
以下管理操作需要在集合级别具有排他锁定:
运作方式