索引併發 蟹行協議和B Link樹

2021-07-27 12:37:32 字數 2280 閱讀 1319

事務的併發問題可以通過兩階段封鎖協議(2pl)或者多版本併發控制(mvcc)等方法解決。這些方法也同樣適用於索引的併發訪問控制。但是,由於索引訪問頻繁,它們將成為封鎖競爭的集中點,導致低併發度。對事務而言,對乙個索引查詢兩次,並在期間發現索引結構發生變化,這是完全可以接受的,只要索引查詢返回正確的元組集。因此,只要維護索引的準確性,對索引進行非可序列化井發訪問是可接受的。

● 當搜尋一條記錄時,蟹行協議先用共享鎖鎖住根節點。然後嘗試獲取子節點的共享鎖,獲得子節點共享鎖後,釋放父節點上的鎖,重複這個過程知道搜尋到葉節點。

● 當插入或刪除一條記錄時:

1、採取與查詢相同的方法,知道找到目標葉節點,到此為止,它只獲得(或釋放)共享鎖。

2、用排它鎖封鎖該葉節點,插入或者刪除記錄。

3、如果需要**乙個結點或將它與兄弟結點合併,或者在兄弟之間重新分配記錄來平衡b+樹,蟹行協議用排他鎖封鎖父結點。在完成這些操作後,它釋放該結點和兄弟結點的鎖。如果父結點需要**、合併或重新分布記錄,協議保留父結點上的鎖,以同樣方式**、合併或重新分布記錄,並且傳播更遠。否則,協議釋放父結點的鎖。

該協議的名字**於螃蟹走路的方式:先移動一邊的腿,然後移動另一條腿。如此交替進行,就像螃蟹移動一樣。

向下的搜尋操作和由於**、合併或重新分布記錄而向上傳播的封鎖操作之間有可能出現死鎖,系統能很容易地處理這種死鎖,它先讓搜尋操作釋放共享鎖,然後從樹根重啟搜尋。

為了避免在獲取另乙個節點的鎖的時候還占有當前節點的鎖(比如蟹行協議),可以對b+樹進行改進,來獲得更高的併發性。b-link樹要求每個結點(包括內部結點,不僅僅是葉結點)維護乙個指向右兄弟結點的指標,這個指標是必要的,因為乙個結點正在**時進行的查詢可能不僅要查詢該結點,而且可能要查詢該結點的右兄弟結點(如果存在的話)。

b-link樹封鎖協議過程:

查詢。b+樹的每個結點在訪問之前必須加共享鎖,非葉子結點的鎖應該在對其子節點申請共享鎖前被釋放(與蟹行協議不同)。如果結點**與查詢同時發生,所希望的記錄可能不再位於查詢過程中所訪問的某個節點內。在這種情況下,記錄在由乙個右兄弟結點表示的範圍內,這是由系統循著指向右兄弟結點的指標而找到的。不過,系統封鎖葉結點遵循兩階段封鎖協議,以避免幻讀。

插入與刪除。系統遵循查詢規則,定位要進行插入或刪除的葉結點。該結點的共享鎖公升級為排他鎖,然後進行插入或刪除。受插人或刪除影響的葉結點封鎖遵循兩階段封鎖協議以避免幻讀。

**。如果事務使乙個結點**,則建立新結點,並作為原始結點的右兄弟。沒置原始結點與新產生結點的右兄弟指標。接著,事務釋放原始節點的排它鎖(假設它是乙個內結點:葉結點以兩階段形式加鎖),然後,發出對父結點加排他鎖的請求,以便插入指向新結點的指標。(不必對新結點加鎖或解鎖。)

合併。執行刪除後,如果乙個結點的記錄太少,則必須對要與之合併的那個結點加排他鎖。一旦這兩個結點合併,則發出對父結點加排他鎖的請求,以便刪除要刪除的結點,此時,事務釋放合併結點的鎖(與查詢操作相反,封鎖從下向上傳播)。除非父結點也需再合併,不然釋放其鎖。

注意這樣乙個重要的事實:插人與刪除操作可能封鎖乙個結點,釋放該結點,然後對它重新封鎖(**或合併節點需要加排它鎖)。此外,與**或合併操作併發執行的查詢可能發現要查詢的記錄被**或合併操作移到右兄弟結點(這並不影響查詢操作,因為查詢操作會查詢當前節點的右兄弟節點)。

我個人喜歡把key value翻譯成記錄,上文也是這麼寫的,下文引用《資料庫系統概念》中的叫法,稱之為碼值。

一些索引併發控制機制不是以兩階段形式封鎖索葉結點的,而是對個別的碼值使用碼值封鎖,允許其他碼值從同乙個葉結點插入或刪除。這樣碼值封鎖增強了併發性,但是有可能引發幻讀。為防止幻讀,可以採用下一碼封鎖技術。這種技術中,每乙個索引查詢不僅封鎖查詢範圍內的多個碼(或單個碼,在點查詢時),而且封鎖下乙個碼值,也就是剛好比範圍內最後乙個碼值大的碼值;並且,每乙個插入必須不僅封鎖要插入的值,而且包括下乙個碼值。這樣,如果乙個事務試圖插入乙個值到另乙個事務的索引查詢範圍之內時,這兩個事務將在插入碼值的下乙個碼值上衝突。同樣地,刪除也必須封鎖刪除值的下乙個碼值,來保證它與別的查詢的查詢範圍的併發衝突被檢測到。

舉例說明:

對於某個葉子節點a,內部含有如下碼值

| 1 | 3 | 4 |

其中1和3之間可以插入2,這個位置被稱作間隙。事務t1搜尋小於等於2的碼值,封鎖了碼值1和3。事務t2插入碼值2,插入的時候要封鎖下乙個碼值3,但是此時3已經被鎖住了,所以寫入操作掛起或取消,避免了事務t1幻讀。

1.資料庫系統概念(原書第5版) 第16章 併發控制

UDP協議和併發程式設計

稱之為資料報協議。特點 1 不需要建立鏈結。2 不需要知道對方是否收到。3 資料不安全 4 傳輸速度快 5 能支援併發 6 不會粘包 7 無需先啟動服務端再啟動客戶端 優點 傳輸速度快 能支援併發 不會粘包 缺點 資料不安全,容易丟失 應用場景 早期的qq聊天室。tcp協議 稱為流式協議 優點 資料...

Lucene 索引的併發讀寫

lucene能夠很好地支援多執行緒 程序 訪問。乙個索引可以被多個程序的indexreader開啟。乙個程序中,推薦indexreader被單例多執行緒使用。indexreader類不僅是執行緒安全的,還是執行緒友好的,即友好地支援併發訪問,中同步 synchronized 塊並不多。對於乙個索引來...

Lucene 索引的併發讀寫

lucene能夠很好地支援多執行緒 程序 訪問。乙個索引可以被多個程序的indexreader開啟。乙個程序中,推薦indexreader被單例多執行緒使用。indexreader類不僅是執行緒安全的,還是執行緒友好的,即友好地支援併發訪問,中同步 synchronized 塊並不多。對於乙個索引來...