有没有人能通过例子解释mongodb中的意图共享和意图排他锁?
我读到了他们的功能,但我无法弄清楚他们在实际数据库示例中的实际用途。
更新 :(更多信息)
假设:mongodb版本高于3.0.0
创建文档时会发生什么?在不同的层中获取哪些锁:DB,Collection或document?(S,X,IS或IX)
答案 0 :(得分:3)
意图锁定是在较低级别锁定到位之前获取的较高级别锁定,并且以这种方式调用,因为它们表示这些较低级别锁定的意图。关于不同的类型,意图共享锁用于不更改或更新数据的读操作,例如find()
查询,而打算使用排它锁进行数据修改操作,例如{{ 1}},save()
和update
。
为了说明这一点,请采用以下示例集合:
remove
如果您运行下面的查找查询,则会在db.data.save({"name":"John"})
db.data.save({"name":"Jane"})
记录上请求意图共享锁。由于此查询不更新数据,其他用户可以运行相同的查询或其他用户,同一记录上可能有多个意图共享锁。
Jane
但是,如果您现在运行此查询:
db.data.find({"name":"Jane"})
请求和intent独占锁定,因为此操作会更改记录。在此记录(或集合)上释放所有其他锁之前,无法将此锁定到位。在独占锁定的情况下,不能在记录(或集合)上应用其他意图锁定。这意味着,如果db.data.update({name:"Jane"},{name:"Janet"})
操作需要相当长的时间,那么在独占锁定期间,任何update
操作都将被阻止。
请注意,自版本2.4以来,锁定行为已显着改善。在版本2.4中,在数据库级别应用的意图独占锁定,而对于版本3.0,锁定仅在使用MMAPv1存储引擎时处于收集级别,而在使用WiredTiger存储引擎时处于记录级别(默认情况下为3.2)。
关于意图锁IS和IX与较低级锁S和X之间的区别,意图锁是用作交通信号的高级锁。一旦意图锁定到位(例如,在收集级别),就将较低级别锁定到位(例如,在文档级别)。此设计减少了管理锁所需的处理,因为并发会话只需读取意图锁而不是所有较低级锁。