【发布时间】:2016-04-09 08:37:35
【问题描述】:
谁能通过例子解释一下mongodb中的意图共享锁和意图排他锁?
我了解了它们的功能,但我无法弄清楚它们在真实数据库示例中的实际用途。
更新:(更多信息)
假设:mongodb版本在3.0.0以上
创建文档时会发生什么?在不同的层获取哪些锁:DB、Collection 或 document?(S、X、IS 或 IX)
【问题讨论】:
-
你用的是什么存储引擎?
谁能通过例子解释一下mongodb中的意图共享锁和意图排他锁?
我了解了它们的功能,但我无法弄清楚它们在真实数据库示例中的实际用途。
更新:(更多信息)
假设:mongodb版本在3.0.0以上
创建文档时会发生什么?在不同的层获取哪些锁:DB、Collection 或 document?(S、X、IS 或 IX)
【问题讨论】:
意向锁是在较低级别锁到位之前获取的较高级别锁,并且以这种方式调用,因为它们表示这些较低级别锁的意图。对于不同的类型,意向共享锁用于不更改或更新数据的读取操作,例如find() 查询,而意向排他锁用于数据修改操作,例如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 之间的区别,意向锁是充当交通信号的高级锁。一旦意图锁到位(例如在集合级别),较低级别的锁就会到位(例如在文档级别)。这种设计减少了管理锁所需的处理,因为并发会话只需读取意图锁而不是所有较低级别的锁。
【讨论】: