ref: https://blog.csdn.net/whyangwanfu/article/details/1926675
可串行化
事務集並發執行產生的任何調度的執行效果等價於這些事務按某個串行順序執行的結果。
可串行化可通過並發控制機制(兩階段封鎖協議)來保證。
-
沖突可串行化
只考慮read(X)與write(X)操作。
若一個調度S通過一系列非沖突指令交換(交換兩條連續的不沖突的指令)與一個串行調度沖突等價,則調度S是沖突可串行化的。 -
視圖可串行化
比沖突可串行化寬松。
可恢復性
- 可恢復調度
對於每對事務Ti與Tj,Tj讀取了Ti寫的數據,則Ti先於Tj提交 - 無級聯調度
對於每對事務Ti與Tj,Tj讀取了Ti寫的數據,則Ti先於Tj的讀取前提交
級聯調度會因一個事務故障導致一系列事務回滾
隔離性的實現
只產生 沖突可串行化或視圖可串行化且無級聯的調度
可串行化判定
- 沖突可串行化檢測
以事務為頂點,構造有向圖,判環
- Ti 中的read(X)在Tj中的write(X)之前
- Ti 中的write(X)在Tj中的read(X)之前
- Ti 中的write(X)在Tj中的write(X)之前
滿足以上任意一條則構造一條邊,Ti -> Tj
- 視圖可串行化檢測
NP完全問題
並發控制
鎖的授予
- 共享鎖S,讀鎖
- 排他鎖X,寫鎖
Q:如何避免申請排他鎖的事務餓死
A:按申請鎖的順序排序授權加鎖
兩階段封鎖協議
- 事務釋放鎖后不能獲得新鎖
保證沖突可串行化,不保證不發生死鎖,事務回滾也可能級聯 - 另有嚴格兩階段封鎖協議(避免級聯回滾)、強兩階段封鎖協議(在該協議下,事務可按提交的順序串行化),多數數據庫采用這兩種協議之一
鎖管理器
I為數據項,T為事務,其中已授予鎖的為黑方塊
多粒度封鎖
某些情況需要將多個數據項聚為一組,作為同步單元。如訪問整個數據庫,對每個數據執行加鎖操作很費時。
意向鎖
將數據庫組織為一棵樹。
事務對一個數據加S鎖時,對其祖先節點加IS鎖,IS表示有子節點擁有S鎖
事務對一個數據加X鎖時,對其祖先節點加IX鎖
同一事務可對一節點同時加S鎖和IX鎖,即SIX鎖
索引結構中的並發
對事務而言,對一個索引查找兩次,並在期間發現索引結構發生了變化,是完全可以接受的,只要索引查找返回正確的元組集即可。
B+樹:蟹行協議
- 搜索:用S鎖鎖住根節點,沿樹向下搜索,在子節點獲得S鎖后,釋放父節點的S鎖。
- 插入刪除:通過搜索找到葉節點,用X鎖鎖住該葉節點執行插入刪除操作。
- 分裂合並:需要分裂一個節點或與兄弟節點合並時,用X鎖鎖住其父節點。