浅析MongoDB中的意向锁

成熟的数据库设计中,须要一个模块对资源的并发控制进行管理。意向锁就是实现资源并发控制管理的经典方式。在讨论它的概念与设计前,咱们先举几个MongoDB的经典场景。数据库

  1. mongoDB 默认是行级并发,咱们但愿多行并发读写互不影响,可是咱们又但愿对在dropCollection时,不能有任何对表的读写在操做,这个“不但愿”也是双向的,即在对表并发读写时,咱们也不但愿dropCollection在操做。

    在执行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四种锁状态。其冲突矩阵为:资源

1d59beaec60ecbb91c6d416245a195b55f1e2204
其使用方式为:io

  1. 对一个节点加IX/X锁时,必须先(递归)获取其父节点的IX锁。im

  2. 对一个节点加IS/S锁时,必须先(递归)获取其父节点的IS锁。数据

相关文章
相关标签/搜索