封鎖簡介
封鎖是實現並發控制的一個非常重要的技術。
DBMS通常提供了多種類型的封鎖。
一個事務對某個數據對象加鎖後究竟擁有什麼樣的控制是由封鎖的類型決定的。
封鎖類型
基本類型
排它鎖(記為X鎖)
共享鎖(記為S鎖)
排它鎖
排它鎖又稱為寫鎖。
若事務T 對數據對象A 加上X 鎖,則只允許T 讀取和修改A , 其它任何事務都不能再對A 加任何類型的鎖,直到T 釋放A 上的鎖。
共享鎖
共享鎖又稱為讀鎖。
若事務T 對數據對象A 加上S 鎖,則其它事務只能再對A 加S 鎖,而不能加X 鎖,直到T 釋放A 上的S 鎖。
X鎖和S鎖都是加在某一個數據對象上的。
封鎖對象
封鎖單元
封鎖的對象可以是邏輯單元,也可以是物理單元。
邏輯單元: 屬性值、屬性值集合、元組、關係、索引項、整個索引、整個資料庫等;
物理單元:頁(數據頁或索引頁)、塊等。
封鎖粒度
封鎖對象可以很大也可以很小,例如對整個資料庫加鎖、對某個屬性值加鎖。
封鎖對象的大小稱為封鎖的粒度。
封鎖的粒度越大,系統中能夠被封鎖的對象就越少,並發度也就越小,但系統開銷也越小;
封鎖的粒度越小,並發度越高,但開銷也就越大。
粒度選擇
選擇封鎖粒度時必須同時考慮開銷和並發度兩個因素,進行權衡,以求得最優的效果。
一般原則——
①需要處理大量元組的用戶事務:以關係為封鎖單元;
②需要處理多個關係的大量元組的用戶事務:以資料庫為封鎖單位;
③只處理少量元組的用戶事務:以元組為封鎖單位
封鎖協定
基本定義
封鎖協定指對數據對象加鎖時,需要約定的一些規則,包括:
①何時申請X鎖或S鎖
②持鎖時間
③何時釋放
兩段鎖協定
可串列性是並行調度正確性的唯一準則,兩段鎖協定就是為保證並行調度可串列性而提供的封鎖協定。
兩段鎖協定的內容:
1. 在對任何數據進行讀、寫操作之前,事務首先要獲得對該數據的封鎖
2. 在釋放一個封鎖之後,事務不再獲得任何其他封鎖。
例:
事務1的封鎖序列:
Sck A ... Sck B ... Xck C ... Unck B ... Unck A ... Unck C;
事務2的封鎖序列:
Sck A ... Unck A ... Sck B ... Xck C ... Unck C ... Unck B;
事務1遵守兩段鎖協定,而事務2不遵守兩段協定。
並行執行的所有事務均遵守兩段鎖協定,則對這些事務的所有並行調度策略都是可串列化的。
所有遵守兩段鎖協定的事務,其並行執行的結果一定是正確的。
死鎖
基本定義
封鎖技術可以有效地解決並行操作的一致性問題,但也帶來死鎖的問題。
解決方法
解決死鎖的兩類方法
1. 死鎖的預防
2. 死鎖的診斷與解除
死鎖的預防
預防死鎖的方法:
(1)一次封鎖法
一次封鎖法要求每個事務必須一次將所有要使用的數據全部加鎖,否則就不能繼續執行。
一次封鎖法存在的問題:降低並發度;擴大封鎖範圍。
一次就將以後要用到的全部數據加鎖,勢必擴大了封鎖的範圍,從而降低了系統的並發度。
(2)順序封鎖法
順序封鎖法是預先對數據對象規定一個封鎖順序,所有事務都按這個順序實行封鎖。
順序封鎖法存在的問題:維護成本高。
資料庫系統中可封鎖的數據對象極其眾多,並且隨數據的插入、刪除等操作而不斷地變化,要維護這樣極多而且變化的資源的封鎖順序非常困難,成本很高。
評價:
在作業系統中廣為採用的預防死鎖的策略並不很適合資料庫的特點。
DBMS 在解決死鎖的問題上更普遍採用的是診斷並解除死鎖的方法。