成熟的数据库设计中,须要一个模块对资源的并发控制进行管理。意向锁就是实现资源并发控制管理的经典方式。在讨论它的概念与设计前,咱们先举几个MongoDB的经典场景。数据库
在执行dbStats命令时,但愿和dropDB/insert命令互斥,可是又不影响对表的并发读。并发
因为写每一个db的每张表,都需要往oplog中写记录,所以oplog是全局的,咱们但愿在truncate oplog这个全局操做在进行时,任何db对oplog的写操做都被阻塞。第一个例子中,咱们彷佛用传统的rwlock就能够解决,在对表进行并发读写前,加rlock,在对表进行dropCollection前,加wlock。 暂不论rwlock的r状态和并发写的行为不一致,至少这样是行得通的。 但是遇到了第二个例子,咱们发现rwlock的rw两个状态没法表达咱们的锁需求了,到了第三个例子,只要能隐约以为,这个锁,还得有层级结构。数据库设计
而意向锁协议,是一种对树形(层级)资源进行并发控制的协议。它由"操做约定"和"冲突矩阵"两部分组成,且看下文。设计
02blog
MongoDB中的意向锁的定义递归
MongoDb使用了简化版的意向锁协议,抛却了SIX状态,保留了 IS/IX/S/X四种锁状态。其冲突矩阵为:资源
其使用方式为:io
对一个节点加IX/X锁时,必须先(递归)获取其父节点的IX锁。im
对一个节点加IS/S锁时,必须先(递归)获取其父节点的IS锁。数据