mongodb - 什么是 mongodb 中的意向共享锁和意向排他锁?

标签 mongodb locks

任何人都可以通过示例解释 mongodb 中的意向共享锁和意向排他锁吗?

我了解了它们的功能,但我无法弄清楚它们在实际数据库示例中的实际用法。

更新:(更多信息)

假设:mongodb版本在3.0.0以上

创建文档时会发生什么?在不同层获取哪些锁:DB、Collection 或 document?(S、X、IS 或 IX)

最佳答案

意向锁是在较低级别的锁就位之前获得的较高级别的锁,之所以这样称呼是因为它们表示这些较低级别的锁的意图。对于不同的类型,意向共享锁用于不更改或更新数据的读取操作,例如 find() 查询,而意向排他锁用于数据修改操作,例如 save()updateremove

为了说明这一点,以这个示例集合为例:

db.data.save({"name":"John"})
db.data.save({"name":"Jane"})

如果您运行下面的查找查询,则会在 Jane 记录上请求意向共享锁。由于此查询不更新数据,其他用户可以运行相同的查询或换句话说,同一条记录上可以有多个意向共享锁。

db.data.find({"name":"Jane"})

但是,如果您现在运行此查询:

db.data.update({name:"Jane"},{name:"Janet"})

并且当此操作更改记录时请求意向排他锁。在释放此记录(或集合)上的所有其他锁之前,无法放置此锁。当独占锁就位时,不能在记录(或集合)上应用其他意向锁。这意味着,如果 update 操作需要相当长的时间,则在独占锁期间任何 find 操作都将被阻止。

请注意,自 2.4 版以来,锁定行为有了显着改进。在 2.4 版中,意向独占锁在数据库级别应用,而对于 3.0 版,锁仅在使用 MMAPv1 存储引擎时在集合级别和在使用 WiredTiger 存储引擎(3.2 中的默认设置)时在记录级别。

关于意向锁IS和IX与低级锁S和X的区别,意向锁是作为交通信号的高级锁。一旦意向锁到位(例如在集合级别),较低级别的锁就位(例如在文档级别)。这种设计减少了管理锁所需的处理,因为并发 session 只需要读取意向锁而不是所有较低级别的锁。

关于mongodb - 什么是 mongodb 中的意向共享锁和意向排他锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34613068/

相关文章:

c - 在 C 中与系统调用同步

java - 找出我的线程落在 ReentrantLock 中的什么位置

java - 如何在Java中拥有 volatile boolean 值数组而不是 volatile boolean 值数组?

operating-system - 如何在多核上实现锁

python - PyMongo聚合查询过滤器?

javascript - 当我尝试发出更新请求时,无法在将 header 发送到客户端后设置 header

regex - MongoDB $regex 查询和潜在利用

sql-server - SQL Server 数据库 : INSERT query blocked with wait type LCK_M_IX

mongodb - 在 MongoDb 中,如何获取嵌入数组中出现的单个匹配元素的 max\min\avg\count ?

javascript - Node.js - Nginx 502