封鎖

資料庫中的的封鎖

封鎖是指事務T在對某個數據對象(例如表、記錄等)操作之前,先向系統發出請求,對其加鎖。加鎖後事務T就對該數據對象有了一定的控制,在事務T釋放它的鎖之前,其它的事務不能更新此數據對象。

簡介


封鎖是實現併發控制的一個非常重要的技術。
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 在解決死鎖的問題上更普遍採用的是診斷並解除死鎖的方法。