1. 程式人生 > >資料庫系統概論(第十一章:併發控制)

資料庫系統概論(第十一章:併發控制)

第十一章  併發控制

1、多使用者資料庫系統
允許多個使用者同時使用的資料庫系統
2、多事務執行方式 
(1)事務序列執行
每個時刻只有一個事務執行,其他事務必須等到這個事務結束以後方能執行
不能充分利用系統資源,發揮資料庫共享資源的特點
(2)交叉併發方式(Interleaved  Concurrency)
在單處理機系統中,事務的並行執行是這些並行事務的並行操作輪流交叉執行
單處理機系統中的並行事務並沒有真正地並行執行,但能夠減少處理機的空閒時間,提高系統的效率
 (3)同時併發方式(simultaneous  concurrency)
多處理機系統中,每個處理機可以執行一個事務,多個處理機可以同時執行多個事務,實現多個事務真正的並行執行
最理想的併發方式,但受制於硬體環境
更復雜的併發方式機制
3、本章討論的資料庫系統併發控制技術是以單處理機系統為基礎的 
4、事務併發執行帶來的問題
(1)會產生多個事務同時存取同一資料的情況 
(2)可能會存取和儲存不正確的資料,破壞事務隔離性和資料庫的一致性
5、資料庫管理系統必須提供併發控制機制
6、併發控制機制是衡量一個數據庫管理系統效能的重要標誌之一

11.1.1 併發控制概述
1、事務是併發控制的基本單位
2、併發控制機制的任務
(1)對併發操作進行正確排程
(2)保證事務的隔離性
(3)保證資料庫的一致性
3、併發操作帶來的資料不一致性
(1)丟失修改(Lost Update)
兩個事務T1和T2讀入同一資料並修改,T2的提交結果破壞了T1提交的結果,導致T1的修改被丟失。
(2)不可重複讀(Non-repeatable Read)
不可重複讀是指事務T1讀取資料後,事務T2執行更新操作,使T1無法再現前一次讀取結果。

不可重複讀包括三種情況:
事務T1讀取某一資料後,事務T2對其做了修改,當事務T1再次讀該資料時,得到與前一次不同的值 事務T1按一定條件從資料庫中讀取了某些資料記錄後,事務T2刪除了其中部分記錄,當T1再次按相同條件讀取資料時,發現某些記錄神祕地消失了。 
事務T1按一定條件從資料庫中讀取某些資料記錄後,事務T2插入了一些記錄,當T1再次按相同條件讀取資料時,發現多了一些記錄。
後兩種不可重複讀有時也稱為幻影現象(Phantom Row)
(3)讀“髒”資料(Dirty Read)
   讀“髒”資料是指:
事務T1修改某一資料,並將其寫回磁碟
事務T2讀取同一資料後,T1由於某種原因被撤銷
這時T1已修改過的資料恢復原值,T2讀到的資料就與資料庫中的資料不一致
T2讀到的資料就為“髒”資料,即不正確的資料 
4、記號
(1)R(x):讀資料x
(2)W(x):寫資料x 
5、資料不一致性:由於併發操作破壞了事務的隔離性

6、併發控制就是要用正確的方式排程併發操作,使一個使用者事務的執行不受其他事務的干擾,從而避免造成資料的不一致性 
7、對資料庫的應用有時允許某些不一致性,例如有些統計工作涉及資料量很大,讀到一些“髒”資料對統計精度沒什麼影響,可以降低對一致性的要求以減少系統開銷 
8、併發控制的主要技術
封鎖(Locking)
時間戳(Timestamp)
樂觀控制法
多版本併發控制(MVCC)



11.2  封鎖
1、什麼是封鎖
(1)封鎖就是事務T在對某個資料物件(例如表、記錄等)操作之前,先向系統發出請求,對其加鎖
(2)加鎖後事務T就對該資料物件有了一定的控制,在事務T釋放它的鎖之前,其它的事務不能更新此資料物件。
(3)封鎖是實現併發控制的一個非常重要的技術
2、基本封鎖型別
(1)一個事務對某個資料物件加鎖後究竟擁有什麼樣的控制由封鎖的型別決定。
(2)基本封鎖型別
排它鎖(Exclusive Locks,簡記為X鎖)
排它鎖又稱為寫鎖。
若事務T對資料物件A加上X鎖,則只允許T讀取和修改A,其它任何事務都不能再對A加任何型別的鎖,直到T釋放A上的鎖。
保證其他事務在T釋放A上的鎖之前不能再讀取和修改A 。
共享鎖(Share Locks,簡記為S鎖)
共享鎖又稱為讀鎖
若事務T對資料物件A加上S鎖,則事務T可以讀A但不能修改A,其它事務只能再對A加S鎖,而不能加X鎖,直到T釋放A上的S鎖
保證其他事務可以讀A,但在T釋放A上的S鎖之前不能對A做任何修改 



11.3  封鎖協議
1、什麼是封鎖協議
(1)在運用X鎖和S鎖對資料物件加鎖時,需要約定一些規則,這些規則為封鎖協議(Locking Protocol)。 
何時申請X鎖或S鎖
持鎖時間
何時釋放
(2)對封鎖方式規定不同的規則,就形成了各種不同的封鎖協議,它們分別在不同的程度上為併發操作的正確排程提供一定的保證。
2、保持資料一致性的常用封鎖協議
一級封鎖協議
(1)事務T在修改資料R之前必須先對其加X鎖,直到事務結束才釋放。
正常結束(COMMIT)
非正常結束(ROLLBACK)
(2)一級封鎖協議可防止丟失修改,並保證事務T是可恢復的。
(3)在一級封鎖協議中,如果僅僅是讀資料不對其進行修改,是不需要加鎖的,所以它不能保證可重複讀和不讀“髒”資料。
二級封鎖協議
(1)一級封鎖協議加上事務T在讀取資料R之前必須先對其加S鎖,讀完後即可釋放S鎖。
(2)二級封鎖協議可以防止丟失修改和讀“髒”資料。
(3)在二級封鎖協議中,由於讀完資料後即可釋放S鎖,所以它不能保證可重複讀。
三級封鎖協議
(1)一級封鎖協議加上事務T在讀取資料R之前必須先對其加S鎖,直到事務結束才釋放。
(2)三級封鎖協議可防止丟失修改、讀髒資料和不可重複讀。
封鎖協議小結
(1)三級協議的主要區別
什麼操作需要申請封鎖以及何時釋放鎖(即持鎖時間)
(2)不同的封鎖協議使事務達到的一致性級別不同
封鎖協議級別越高,一致性程度越高



11.4  活鎖和死鎖
(1)封鎖技術可以有效地解決並行操作的一致性問題,但也帶來一些新的問題
死鎖
活鎖
11.4.1 活鎖
1、事務T1封鎖了資料R

2、事務T2又請求封鎖R,於是T2等待。
3、T3也請求封鎖R,當T1釋放了R上的封鎖之後系統首先批准了T3的請求,T2仍然等待。

4、T4又請求封鎖R,當T3釋放了R上的封鎖之後系統又批准了T4的請求……
5、T2有可能永遠等待,這就是活鎖的情形 
6、避免活鎖:採用先來先服務的策略
(1)當多個事務請求封鎖同一資料物件時
(2)按請求封鎖的先後次序對這些事務排隊
(3)該資料物件上的鎖一旦釋放,首先批准申請佇列中第一個事務獲得鎖


11.4.2  死鎖
1、事務T1封鎖了資料R1
2、T2封鎖了資料R2
3、T1又請求封鎖R2,因T2已封鎖了R2,於是T1等待T2釋放R2上的鎖
4、接著T2又申請封鎖R1,因T1已封鎖了R1,T2也只能等待T1釋放R1上的鎖
5、這樣T1在等待T2,而T2又在等待T1,T1和T2兩個事務永遠不能結束,形成死鎖 
6、解決死鎖的方法
兩類方法
(1)死鎖的預防
(2)死鎖的診斷與解除
7、死鎖的預防
(1)產生死鎖的原因是兩個或多個事務都已封鎖了一些資料物件,然後又都請求對已為其他事務封鎖的資料物件加鎖,從而出現死等待。
(2)預防死鎖的發生就是要破壞產生死鎖的條件
(3)預防死鎖的方法
一次封鎖法
順序封鎖法
8、 死鎖的診斷與解除
(1)死鎖的診斷
超時法
如果一個事務的等待時間超過了規定的時限,就認為發生了死鎖
優點:實現簡單
缺點:
有可能誤判死鎖
時限若設定得太長,死鎖發生後不能及時發現

等待圖法 
用事務等待圖動態反映所有事務的等待情況
事務等待圖是一個有向圖G=(T,U)。
T為結點的集合,每個結點表示正執行的事務。
U為邊的集合,每條邊表示事務等待的情況。
若T1等待T2,則T1,T2之間劃一條有向邊,從T1指向T2
併發控制子系統週期性地(比如每隔數秒)生成事務等待圖,檢測事務。如果發現圖中存在迴路,則表示系統中出現了死鎖。

解除死鎖
選擇一個處理死鎖代價最小的事務,將其撤消
釋放此事務持有的所有的鎖,使其它事務能繼續執行下去


11.5  併發排程的可序列性
1、資料庫管理系統對併發事務不同的排程可能會產生不同的結果
2、序列排程是正確的
3、執行結果等價於序列排程的排程也是正確的,稱為可序列化排程

 
11.5.1 可序列化排程
1、可序列化(Serializable)排程
多個事務的併發執行是正確的,當且僅當其結果與按某一次序序列地執行這些事務時的結果相同
2、可序列性(Serializability)
(1)是併發事務正確排程的準則
(2)一個給定的併發排程,當且僅當它是可序列化的,才認為是正確排程 



11.5.2 衝突可序列化排程
1、衝突可序列化
(1)一個比可序列化更嚴格的條件
(2)商用系統中的排程器採用
2、衝突操作:是指不同的事務對同一資料的讀寫操作和寫寫操作:     
Ri(x)與Wj(x)        /*事務Ti讀x,Tj寫x,其中i≠j*/
Wi(x)與Wj(x)         /*事務Ti寫x,Tj寫x,其中i≠j*/
    其他操作是不衝突操作
3、衝突
不能交換(Swap)的動作:
同一事務的兩個操作
不同事務的衝突操作
4、衝突可序列化(續)
(1)一個排程Sc在保證衝突操作的次序不變的情況下,通過交換兩個事務不衝突操作的次序得到另一個排程Sc’,如果Sc’是序列的,稱排程Sc是衝突可序列化的排程
(2)若一個排程是衝突可序列化,則一定是可序列化的排程
(3)可用這種方法判斷一個排程是否是衝突可序列化的
(4)衝突可序列化排程是可序列化排程的充分條件,不是必要條件。還有不滿足衝突可序列化條件的可序列化排程。



11.6  兩段鎖協議
1、資料庫管理系統普遍採用兩段鎖協議的方法實現併發排程的可序列性,從而保證排程的正確性 
2、兩段鎖協議  
指所有事務必須分兩個階段對資料項加鎖和解鎖 
(1)在對任何資料進行讀、寫操作之前,事務首先要獲得對該資料的封鎖
(2)在釋放一個封鎖之後,事務不再申請和獲得任何其他封鎖
“3、兩段”鎖的含義
事務分為兩個階段
(1)第一階段是獲得封鎖,也稱為擴充套件階段
事務可以申請獲得任何資料項上的任何型別的鎖,但是不能釋放任何鎖  
(2)第二階段是釋放封鎖,也稱為收縮階段
事務可以釋放任何資料項上的任何型別的鎖,但是不能再申請任何鎖 
4、事務遵守兩段鎖協議是可序列化排程的充分條件,而不是必要條件。

5、若併發事務都遵守兩段鎖協議,則對這些事務的任何併發排程策略都是可序列化的
6、若併發事務的一個排程是可序列化的,不一定所有事務都符合兩段鎖協議
7、兩段鎖協議與防止死鎖的一次封鎖法
(1)一次封鎖法要求每個事務必須一次將所有要使用的資料全部加鎖,否則就不能繼續執行,因此一次封鎖法遵守兩段鎖協議
(2)但是兩段鎖協議並不要求事務必須一次將所有要使用的資料全部加鎖,因此遵守兩段鎖協議的事務可能發生死鎖



11.7  封鎖的粒度
1、封鎖物件的大小稱為封鎖粒度(Granularity) 
2、封鎖的物件:邏輯單元,物理單元
3、選擇封鎖粒度原則
(1)封鎖粒度與系統的併發度和併發控制的開銷密切相關。
封鎖的粒度越大,資料庫所能夠封鎖的資料單元就越少,併發度就越小,系統開銷也越小;
封鎖的粒度越小,併發度較高,但系統開銷也就越大




11.7.1 多粒度封鎖
1、多粒度樹
(1)以樹形結構來表示多級封鎖粒度。
(2)根結點是整個資料庫,表示最大的資料粒度。
(3)葉結點表示最小的資料粒度。
2、允許多粒度樹中的每個結點被獨立地加鎖
3、對一個結點加鎖意味著這個結點的所有後裔結點也被加以同樣型別的鎖
4、在多粒度封鎖中一個數據物件可能以兩種方式封鎖:顯式封鎖和隱式封鎖
5、顯式封鎖和隱式封鎖
(1)顯式封鎖: 直接加到資料物件上的封鎖。
(2)隱式封鎖:是該資料物件沒有獨立加鎖,是由於其上級結點加鎖而使該資料物件加上了鎖
(3)顯式封鎖和隱式封鎖的效果是一樣的
(4)系統檢查封鎖衝突時
要檢查顯式封鎖
還要檢查隱式封鎖
(5)對某個資料物件加鎖,系統要檢查
該資料物件
有無顯式封鎖與之衝突
所有上級結點
檢查本事務的顯式封鎖是否與該資料物件上的隱式封鎖衝突:(由上級結點已加的封鎖造成的)
所有下級結點
看上面的顯式封鎖是否與本事務的隱式封鎖(將加到下級結點的封鎖)衝突


11.7.2 意向鎖
1、引進意向鎖(intention lock)目的
提高對某個資料物件加鎖時系統的檢查效率
2、如果對一個結點加意向鎖,則說明該結點的下層結點正在被加鎖
3、對任一結點加基本鎖,必須先對它的上層結點加意向鎖 
4、常用意向鎖
意向共享鎖(Intent Share Lock,簡稱IS鎖)
意向排它鎖(Intent Exclusive Lock,簡稱IX鎖)
共享意向排它鎖(Share Intent Exclusive Lock,簡稱SIX鎖)
5、IS鎖
如果對一個數據物件加IS鎖,表示它的後裔結點擬(意向)加S鎖。
6、IX鎖
如果對一個數據物件加IX鎖,表示它的後裔結點擬(意向)加X鎖。
7、SIX鎖
如果對一個數據物件加SIX鎖,表示對它加S鎖,再加IX鎖,即SIX = S + IX。
8、具有意向鎖的多粒度封鎖方法
(1)申請封鎖時應該按自上而下的次序進行
(2)釋放封鎖時則應該按自下而上的次序進行
9、具有意向鎖的多粒度封鎖方法
(1)提高了系統的併發度
(2)減少了加鎖和解鎖的開銷
(3)在實際的資料庫管理系統產品中得到廣泛應用 


11.9 小結
1、資料庫的併發控制以事務為單位

2、資料庫的併發控制通常使用封鎖機制
(1)基本封鎖
(2)多粒度封鎖
3、活鎖和死鎖
4、併發事務排程的正確性
(1)可序列性
併發操作的正確性則通常由兩段鎖協議來保證。
兩段鎖協議是可序列化排程的充分條件,但不是必要條件
(2)衝突可序列性
5、其他併發控制機制
時間戳方法
樂觀控制法
多版本併發控制