併發控制機制的任務
對併發操作進行正確調度;保證事務的隔離性;保證數據庫的一致性
數據不一致性:由於併發操作破壞了事務的隔離性
併發控制就是要用正確的方式調度併發操作,使一個用戶事務的執行不受其他事務的干擾,從而避免造成數據的不一致性
併發控制帶來的問題
併發操作帶來的數據不一致性
丟失修改(Lost Update)
兩個事務T1和T2讀入同一數據並修改,T2的提交結果破壞了T1提交的結果,導致T1的修改被丟失。
不可重複讀(Non-repeatable Read)
不可重複讀是指事務T1讀取數據後,事務T2執行更新操作,使T1無法再現前一次讀取結果。
讀“髒”數據(Dirty Read)
事務T1修改某一數據,並將其寫回磁盤;事務T2讀取同一數據後,T1由於某種原因被撤銷;這時T1已修改過的數據恢復原值,T2讀到的數據就與數據庫中的數據不一致
併發控制的主要技術
- 封鎖(Locking)
- 時間戳(Timestamp)
- 樂觀控制法
封鎖的基本類型
X鎖,寫鎖,排它鎖
若事務T對數據對象A加上X鎖,則只允許T讀取和修改A,其它任何事務都不能再對A加任何類型的鎖,直到T釋放A上的鎖
S鎖,讀鎖,共享鎖
若事務T對數據對象A加上S鎖,則其它事務只能再對A加S鎖,而不能加X鎖,直到T釋放A上的S
封鎖協議
一級封鎖協議
事務T在修改數據R之前必須先對其加X鎖,直到事務結束才釋放。
解決問題:丟失修改,並保證事務T是可恢復的。
二級封鎖協議
在一級封鎖協議基礎上,增加事務T在讀數據R之前必須先對其加S鎖,讀完後即可釋放S鎖。
解決問題:丟失修改、讀“髒”數據。
三級封鎖協議
在一級封鎖協議的基礎上,增加事務T在讀數據R之前必須先對其加S鎖,直到事務結束才釋放。
解決問題:丟失修改、讀“髒”數據、不可重複讀。
活鎖
多個事務請求封鎖同意數據,其中一個事務無限期地等待
避免活鎖:採用先來先服務的策略
死鎖
事務A鎖定數據1,請求訪問數據2;事務B鎖定數據2,請求訪問數據1。事務AB永遠在等待對方釋放數據。
1. 預防死鎖 (難以實現)
破壞產生死鎖的條件
一次封鎖法
要求每個事務必須一次將所有要使用的數據全部加鎖,否則就不能繼續執行
存在的問題 1 降低系統併發度 2 難於事先精確確定封鎖對象
順序封鎖法
預先對數據對象規定一個封鎖順序,所有事務都按這個順序實行封鎖。
順序封鎖法存在的問題 1維護成本 2難以實現:很難事先確定每一個事務要封鎖哪些對象
2. 死鎖的診斷與解除(主要)
超時法
如果一個事務的等待時間超過了規定的時限,就認爲發生了死鎖
優點:實現簡單
缺點:1有可能誤判死鎖 2時限若設置得太長,死鎖發生後不能及時發現
事務等待圖法
用事務等待圖動態反映所有事務的等待情況
併發控制子系統週期性地(比如每隔數秒)生成事務等待圖,檢測事務。如果發現圖中存在迴路,則表示系統中出現了死鎖。
併發調度的可串行性
一個給定的併發調度,當且僅當它是可串行化的,才認爲是正確調度
多個事務的併發執行是正確的,當且僅當其結果與按某一次序串行地執行這些事務時的結果相同
衝突可串行化調度
一個調度Sc在保證衝突操作的次序不變的情況下,通過交換兩個事務不衝突操作的次序得到另一個調度Sc‘,且Sc’是串行的
衝突操作是指不同的事務對同一個數據的讀寫操作和寫寫操作
一個調度是衝突可串行化,一定是可串行化的調度。衝突可串行化調度是可串行化調度的充分條件,不是必要條件。
兩段鎖協議
將事務分爲兩個階段
第一階段是獲得封鎖,也稱爲擴展階段
在對任何數據進行讀、寫操作之前,事務首先要獲得對該數據的封鎖
事務可以申請獲得任何數據項上的任何類型的鎖,但是不能釋放任何鎖
第二階段是釋放封鎖,也稱爲收縮階段
在釋放一個封鎖之後,事務不再申請和獲得任何其他封鎖
事務可以釋放任何數據項上的任何類型的鎖,但是不能再申請任何鎖
理論上證明使用兩段封鎖協議產生的是可串行化調度
- 事務遵守兩段鎖協議是可串行化調度的充分條件,而不是必要條件。
- 若併發事務都遵守兩段鎖協議,則對這些事務的任何併發調度策略都是可串行化的
- 若併發事務的一個調度是可串行化的,不一定所有事務都符合兩段鎖協議
封鎖粒度
封鎖對象的大小稱爲封鎖粒度(Granularity)
封鎖的對象:邏輯單元,物理單元
在關係數據庫中,封鎖對象:
邏輯單元: 屬性值、屬性值集合、元組、關係、索引項、整個索引、整個數據庫等
物理單元:頁(數據頁或索引頁)、物理記錄等
封鎖粒度與系統的併發度和併發控制的開銷密切相關。
- 封鎖的粒度越大,數據庫所能夠封鎖的數據單元就越少,併發度就越小,系統開銷也越小;
- 封鎖的粒度越小,數據庫所能夠封鎖的數據單元就越多,併發度較高,但系統開銷也就越大
意向鎖
多粒度封鎖協議:對數據加鎖,也要對他的上級數據加鎖
意向鎖:提高對某個數據對象加鎖時系統的檢查效率
- 如果對一個結點加意向鎖,則說明該結點的下層結點正在被加鎖
- 對任一結點加基本鎖,必須先對它的上層結點加意向鎖
IS鎖 意向共享鎖
如果對一個數據對象加IS鎖,表示它的後裔結點擬(意向)加S鎖。
例如:事務T1要對R1中某個元組加S鎖,則要首先對關係R1和數據庫加IS鎖
IX鎖 意向排它鎖
如果對一個數據對象加IX鎖,表示它的後裔結點擬(意向)加X鎖。
例如:事務T1要對R1中某個元組加X鎖,則要首先對關 系R1和數據庫加IX鎖
SIX鎖 共享意向排它鎖
如果對一個數據對象加SIX鎖,表示對它加S鎖,再加IX鎖,即SIX = S + IX。
例:對某個表加SIX鎖,則表示該事務要讀整個表(所以要對該表加S鎖),同時會更新個別元組(所以要對該表加IX鎖)。