1. 程式人生 > >資料庫知識整理 - 併發控制

資料庫知識整理 - 併發控制

主要內容

兩種基本封鎖型別 

封鎖協議

活鎖

死鎖

多粒度封鎖

意向鎖

鎖的強度


 

前提

併發控制技術與前一篇提到的資料庫恢復技術是主要的事務處理技術,同時併發控制機制和資料庫恢復機制是資料庫管理系統(DBMS)的重要組成部分。

單處理機系統中,事務的並行執行實際上是這些並行事務輪流交叉執行。這種並行執行方式稱為交叉併發方式(interleaved concurrency)

。雖然單處理機系統中的並行事務並沒有真正地(物理上)並行執行,但是減少了處理機和各裝置的空閒時間,提高了系統的效率。

多處理機系統中,當事務數小於處理機數時,每個處理機可以執行一個事務,實現真正意義上的並行執行。這種並行執行方式稱為同時併發方式(simultaneous concurrency)

當多個使用者併發地操作資料庫時,就有可能出現多個事務同時存取同一資料的情況,這種情況可能會破壞事務的一致性和資料庫的一致性,所以資料庫管理系統(DBMS)必須提供併發控制機制。併發控制機制是衡量一個DBMS效能的重要標誌之一。


 

併發操作帶來的資料不一致性

以下三類資料不一致性的主要原因是併發操作破壞了事務的隔離性

1)丟失修改(lost update):

事務T1和T2先後讀入同一資料並修改,T1先提交,T2後提交,T2提交的結果將覆蓋T1的結果,導致T1的修改被丟失。

2)不可重複讀(non-repeatable read):

事務T1讀入某一資料後(未進行操作),T2對同一資料進行了操作(修改、插入、刪除),當T1再次讀入該資料時,得到與前一次不同的值(或者多了、少了某些記錄)。這種不一致性與丟失修改的理想情況相反。

3)讀“髒”資料(dirty read):

事務T1修改某一資料後將其寫入磁碟,事務T2讀入修改後的資料,此時T1由於某種原因被撤銷(ROLLBACK),被T1修改的資料恢復原值,導致T2讀入的資料與資料庫中的資料不一致。


 

封鎖

事務T在對某個資料物件,如表、記錄等操作之前,需要先向系統發出加鎖請求,在事務T釋放它的鎖之前,其他事務不能對此資料進行修改。

 

兩種基本封鎖型別 

1)排他鎖(exclusive locks,X鎖):

排他鎖又稱為寫鎖。事務T對資料物件A加上X鎖後,只允許事務T對A進行讀取和修改,其他事務不能對A加任何型別的鎖,直到T釋放它的X鎖為止。從而保證了其他事務在T釋放A上的X鎖之前不能對A進行讀取和修改。

2)共享鎖(share locks,S鎖):

共享鎖又稱為讀鎖。事務T對資料物件A加上S鎖後,事務T只能對A進行讀取,而不能修改。其他事務可以繼續對A加上S鎖,但是不能加X鎖,直到T釋放它的S鎖為止。從而保證了其他事務可以讀取A,但是在T釋放A上的S鎖之前不能對A進行修改。

*需要注意的是,同一事務可以不斷對某個資料物件加鎖,不需要等鎖的釋放。

 

封鎖協議

1)一級封鎖協議:

定義:事務T在修改資料A前,必須先對A加X鎖,直到事務結束才釋放因此X鎖又被稱為寫鎖,意為修改。

目的:解決“丟失修改”的不一致問題,即在下一個事務操作前,先把上一個事務的修改操作結束。

實現:事務T1的X鎖→事務T2的X鎖

事務T1對資料物件A加上X鎖後,只有等事務T1(修改)結束,釋放X鎖,事務T2才能對A加鎖並進行操作(讀取、修改)。

 

2)二級封鎖協議:

定義:在一級封鎖協議的基礎上,增加事務T在讀取資料A前,必須先對A加S鎖,讀完後即可釋放因此S鎖又被稱為讀鎖,意為讀取。

目的:在一級封鎖協議的基礎上,進一步解決“讀‘髒’資料”的不一致問題,即在下一個事務讀取前,先等上一個事務的撤銷操作結束。

實現:事務T1的X鎖→事務T2的S鎖(讀取資料後釋放S鎖)

事務T1對資料物件A加上X鎖後,只有等事務T1(修改、撤銷)結束,釋放X鎖,事務T2才能對A加鎖並進行操作(讀取)。

 

3)三級封鎖協議:

定義:在一級封鎖協議的基礎上,增加事務T在讀取資料A前,必須先對A加S鎖,直到事務結束才釋放(與二級的區別)

目的:在二級封鎖協議的基礎上,進一步解決“不可重複讀”的不一致問題,即在下一個事務修改前,先等上一個事務的重複讀操作結束。

實現:事務T1的S鎖(事務結束後釋放S鎖)→事務T2的X鎖

事務T1對資料物件A加上S鎖後,只有等事務T1(重複讀取)結束,釋放S鎖,事務T2才能對A加X鎖並進行操作(修改)。


 

活鎖和死鎖

和作業系統一樣,封鎖的方法可能引起活鎖和死鎖等問題。

 

活鎖

根據事務的優先順序順序,可能會出現某個事務永遠在等待封鎖的情況,即事務T1封鎖了資料物件A後,T2、T3陸續請求封鎖,但是T1釋放鎖後,系統優先批准了T3的請求,T2仍然在等待。

最簡單的解決方法就是先來先服務(FCFS),不考慮事務的優先順序。

 

死鎖

事務T1封鎖了資料A,事務T2封鎖了資料B,然後T1請求封鎖B,與此同時T2也請求封鎖A,但因為兩個事務的請求都需要等待對方釋放鎖,這樣就出現了永遠在等待對方的死鎖。

在資料庫中,解決死鎖問題主要有兩類方法:預防和診斷解除。

1)預防:

1. 一次封鎖法:每個事務一次將所有要使用的資料加鎖,否則事務不能繼續執行。

帶來的問題:阻礙了其他事務對資料的利用,從而降低了系統的併發度。

2. 順序封鎖法:預先對資料規定一個封鎖順序,所有事務都按照這個順序加鎖,保證“先到先得”。

帶來的問題:需要處理的資訊太多,開銷大,成本高。

 

2)診斷與解除:

1. 超時法:某個事務的等待時間超過規定時間,則系統判定為死鎖。

帶來的問題:規定時間過短,可能誤判死鎖;規定時間過長,可能不能及時發現死鎖。

2. 等待圖法:併發控制子系統週期性地生成事務等待圖,動態地反映所有事務的等待情況。如果發現圖中存在迴路,則表示系統中出現了死鎖。

解除方法:通常撤銷一個處理代價最小的事務,釋放此事務持有的所有鎖,使其他事務得以繼續執行下去。


 

併發排程的可序列性

可序列性是併發事務正確排程的準則。

當且僅當多個事務的併發執行結果,與按某一次序的序列執行結果相同,這種併發排程策略才是可序列化排程,即具有可序列性。

 

例子(《資料庫系統概論(第5版)》p318):

事務T1:讀B;A=B+1;寫A

事務T2:讀A;B=A+1;寫B

 

那麼如何判斷可序列化排程呢?

我們需要引入一個概念——衝突操作,衝突操作是指不同事務對同一個資料讀寫寫寫操作,其他操作都屬於不衝突操作。

很容易理解,對於同一資料的操作,不可能一邊在讀,同時另一邊在寫,更不可能兩邊都在寫,這是不符合邏輯的。

 

在一個排程策略中,交換兩個事務的不衝突操作的次序,得到另一個排程策略,如果另一個排程策略的執行結果與原來的排程相同,則稱原來的排程為衝突可序列化排程

衝突可序列化排程是可序列化排程的充分條件,但不是必要條件。


 

兩段鎖協議

為了保證併發排程的正確性,DBMS的併發控制機制必須提供一定的手段來保證排程是可序列化的。

目前DBMS普遍採用兩段鎖協議(TwoPhase Locking,2PL)來實現,所有事務遵守兩段鎖協議是可序列化排程的充分條件,但不是必要條件。

 

兩段鎖的含義:

1)第一階段(擴充套件階段):所有事務對資料加鎖,但不能解鎖;

2)第二階段(收縮階段):所有事務對資料解鎖,但不能加鎖。

*需要注意的是,不同事務對同一資料的加鎖仍遵循兩種鎖的特性以及封鎖協議。

 

預防死鎖的一次封鎖法遵守兩段鎖協議;但是兩段鎖協議並不要求事務必須一次將所有要使用的資料全部加鎖,因此遵守兩段鎖協議的事務可能發生死鎖。


 

封鎖的粒度

封鎖粒度(granularity)是指封鎖物件的大小。

封鎖物件可以是邏輯單元,也可以是物理單元。以關係資料庫為例,邏輯單元包括屬性值、屬性值的集合、元組、關係、索引項、索引表乃至整個資料庫;物理單元包括頁(資料頁或索引頁)、物理記錄等。

 

封鎖粒度與系統的併發度併發控制的開銷有關:封鎖粒度越大,資料庫能封鎖的資料單元越少,併發度越小,系統開銷也變小。

一般來說,處理個別元組的事務以元組為封鎖粒度;處理某個關係的大量元組的事務以關係為封鎖粒度;處理多個關係的大量元組的事務以資料庫為封鎖粒度。

 

多粒度封鎖

在一個系統中,提供多種封鎖粒度給不同的事務選擇,這種封鎖方法稱為多粒度封鎖( multiple granularity locking)

  • 定義多粒度樹:多粒度樹的根結點是整個資料庫,表示最大的封鎖粒度,葉結點是最小的封鎖粒度,如元組、屬性值等。
  • 封鎖協議:給一個結點加鎖的同時,該結點的所有後裔結點也會被加上同樣的鎖。對於該結點來說,這種加鎖方式為顯式封鎖,而對於其後裔結點來說,這樣的方式為隱式封鎖

在多粒度封鎖中,顯式封鎖和隱式封鎖的效果是一樣的,因此係統檢查封鎖衝突時,不僅要檢查顯式封鎖,還要沿著多粒度樹上下檢查隱式封鎖。

顯然,這樣的檢查方法效率很低。為此人們引進了一種新型鎖,稱為意向鎖(intention lock)

 

 

意向鎖

對任何一個結點加鎖時,必須先對它的上層結點加意向鎖。

 

三種常用的意向鎖:

1)意向共享鎖(IS鎖):

對一個數據物件加IS鎖,表示它的後裔結點擬(意向)加S鎖

事務T1對資料物件A加上IS鎖後,事務T2可以繼續加除X鎖以外的鎖。

2)意向排他鎖(IX鎖):

對一個數據物件加IX鎖,表示它的後裔結點擬(意向)加X鎖

事務T1對資料物件A加上IX鎖後,事務T2只能繼續加IS或IX鎖

3)共享意向排他鎖(SIX = S+IX鎖):

對一個數據物件先加S鎖,再加IX鎖。例如對某個表加SIX鎖,則表示該事務要讀(S)整個表,同時會更新(IX

)個別元組。

事務T1對資料物件A加上SIX鎖後,事務T2只能加IS鎖

 

在具有意向鎖的多粒度封鎖方法中,任意事務T要對一個數據物件加鎖,必須先對它的上層結點加意向鎖。

申請封鎖時應該按自上而下的次序進行,釋放封鎖時則應該按自下而上的次序進行。(棧結構)

 

具有意向鎖的多粒度封鎖方法提高了系統的併發度,減少了加鎖和解鎖的開銷,已經在實際的DBMS產品中得到廣泛使用。

 

鎖的強度

鎖的強度是指它對其他鎖的排斥程度。

一個事務在申請封鎖時,以強鎖代替弱鎖是安全的,反之不然。

強度排序:

X > SIX > S / IX > IS