成熟的數據庫設計中,須要一個模塊對資源的併發控制進行管理。意向鎖就是實現資源併發控制管理的經典方式。在討論它的概念與設計前,咱們先舉幾個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鎖。數據