淺析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鎖。數據

相關文章
相關標籤/搜索