mongodb 中的意向共享锁和意向排他锁是什么?
What are intention shared and intention exclusive locks in mongodb?
任何人都可以通过示例解释 mongodb 中的意向共享锁和意向排他锁吗?
我了解了它们的功能,但我无法弄清楚它们在实际数据库示例中的实际用法。
更新:(更多信息)
假设:mongodb版本在3.0.0以上
创建文档时会发生什么?在不同的 layer:DB、Collection 或 document 中获取了哪些锁?(S、X、IS 或 IX)
意向锁是在较低级别的锁就位之前获得的较高级别的锁,之所以这样称呼是因为它们表示这些较低级别的锁的意图。关于不同类型,意向共享锁用于不更改或更新数据的读取操作,例如 find()
查询,而意向排他锁用于 data-modification 操作,例如save()
、update
和 remove
。
为了说明这一点,以这个示例集合为例:
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的区别,意向锁是作为交通信号的高级锁。一旦意向锁到位(例如在集合级别),较低级别的锁就位(例如在文档级别)。这种设计减少了管理锁所需的处理,因为并发会话只需要读取意向锁而不是所有较低级别的锁。
任何人都可以通过示例解释 mongodb 中的意向共享锁和意向排他锁吗?
我了解了它们的功能,但我无法弄清楚它们在实际数据库示例中的实际用法。
更新:(更多信息)
假设:mongodb版本在3.0.0以上
创建文档时会发生什么?在不同的 layer:DB、Collection 或 document 中获取了哪些锁?(S、X、IS 或 IX)
意向锁是在较低级别的锁就位之前获得的较高级别的锁,之所以这样称呼是因为它们表示这些较低级别的锁的意图。关于不同类型,意向共享锁用于不更改或更新数据的读取操作,例如 find()
查询,而意向排他锁用于 data-modification 操作,例如save()
、update
和 remove
。
为了说明这一点,以这个示例集合为例:
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的区别,意向锁是作为交通信号的高级锁。一旦意向锁到位(例如在集合级别),较低级别的锁就位(例如在文档级别)。这种设计减少了管理锁所需的处理,因为并发会话只需要读取意向锁而不是所有较低级别的锁。