【问题标题】:What are intention shared and intention exclusive locks in mongodb?什么是mongodb中的意向共享锁和意向排他锁?
【发布时间】:2016-04-09 08:37:35
【问题描述】:

谁能通过例子解释一下mongodb中的意图共享锁和意图排他锁?

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

更新:(更多信息)

假设:mongodb版本在3.0.0以上

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

【问题讨论】:

  • 你用的是什么存储引擎?

标签: mongodb locks


【解决方案1】:

意向锁是在较低级别锁到位之前获取的较高级别锁,并且以这种方式调用,因为它们表示这些较低级别锁的意图。对于不同的类型,意向共享锁用于不更改或更新数据的读取操作,例如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 之间的区别,意向锁是充当交通信号的高级锁。一旦意图锁到位(例如在集合级别),较低级别的锁就会到位(例如在文档级别)。这种设计减少了管理锁所需的处理,因为并发会话只需读取意图锁而不是所有较低级别的锁。

【讨论】:

  • 感谢您的解释,但为什么 db 在只能使用 S 和 X 的情况下使用 IS 和 IX? IS和IX的附加值是多少?
  • 这种设计如何帮助减少锁管理的流程?找到所需的文档后,我们只需要检查该文档的锁,而不是集合中的所有其他锁。
  • 如果在集合级别存在意向排他锁,则在该锁被释放之前无需查找所需的文档。 Intent 锁位于层次结构的顶部,其目的是尽可能防止对低级锁进行不必要的检查。
  • 如果collection有IX锁,是否意味着所有的文档都在更新?是不是违背了文档级别的锁理念?
  • 谢谢,现在我知道它在不同的引擎中是如何工作的,但对我来说仍然很模糊,为什么在 MMAPv1 引擎中,更新发生时会采用 IX 锁?为什么不使用IX锁,而不是X锁?
猜你喜欢
  • 1970-01-01
  • 2018-05-16
  • 1970-01-01
  • 1970-01-01
  • 2012-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-16
相关资源
最近更新 更多