关系数据库——并发控制
并發控制
多用戶數據庫:允許多個用戶同時使用的數據庫(訂票系統)
不同的多事務執行方式:
???????? 1.串行執行:每個時刻只有一個事務運行,其他事務必須等到這個事務結束后方能運行。
???????? 2.交叉并發方式:
單處理機系統中,事務的并發執行實際上是這些并行事務的并行操作輪流交叉運行(不是真正的并發,但是提高了系統效率)
3.同時并發方式:
多處理機系統中,每個處理機可以運行一個事務,多個處理機可以同時運行多個事務,實現多個事務真正的并行運行
并發執行帶來的問題:
???????? 多個事務同時存取同一數據(共享資源)
???????? 存取不正確的數據,破壞事務一致性和數據庫一致性
概述
并發操作帶來的數據不一致性包括
???????? 1)丟失修改(lost update)
???????? 2)不可重復讀(non-repeatable read)
???????? 3)讀臟數據(dirty read)
記號:W(x)寫數據x?????????? R(x)讀數據x
?
并發控制機制的任務:
???????? 1)對并發操作進行正確的調度
???????? 2)保證事務的隔離性
???????? 3)保證數據庫的一致性
并發控制的主要技術
???????? 1)封鎖(locking)(主要使用的)
???????? 2)時間戳(timestamp)
???????? 3)樂觀控制法(optimistic scheduler)
???????? 4)多版本并發控制(multi-version concurrency control ,MVCC)
封鎖
封鎖:封鎖就是事務T在對某個數據對象(例如表、記錄等)操作之前,先向系統發出請求,對其加鎖。加鎖后事務T就對該數據對象有了一定的控制,在事務T釋放它的鎖之前,其它的事務不能更新此數據對象
?
確切的控制由封鎖的類型決定
基本的封鎖類型有兩種:排它鎖(X鎖,exclusive locks)、共享鎖(S 鎖,share locks)
排它鎖又稱寫鎖,對A加了排它鎖之后,其他事務不能對A加 任何類型的鎖(排斥讀和寫)
共享鎖又稱讀鎖,對A加了共享鎖之后,其他事務只能對A加S鎖,不能加X鎖(只排斥寫)
(很重要)
封鎖協議
在運用X鎖和S鎖對數據對象加鎖時,需要約定一些規則:封鎖協議(Locking Protocol)
何時申請X鎖或S鎖、持鎖時間、何時釋放
對封鎖方式制定不同的規則,就形成了各種不同的封鎖協議。
常用的封鎖協議:三級封鎖協議
三級封鎖協議在不同程度上解決了并發問題,為并發操作的正確調度提供一定的保證。
?
1、一級封鎖協議
事務T在修改數據R之前,必須先對其加X鎖,直到事務結束(commit/rollback)才釋放。
一級封鎖協議可以防止丟失修改
如果是讀數據,不需要加鎖的,所以它不能保證可重復讀和不讀“臟”數據。
2、 二級封鎖協議
???????? 在一級封鎖協議的基礎(寫要加X鎖,事務結束釋放)上,增加事務T在讀入數據R之前必須先對其加S鎖,讀完后即可釋放S鎖。(讀要加S鎖,讀完即釋放)
二級封鎖協議除了可以防止丟失修改,還可以防止讀臟數據
由于讀完數據即釋放S鎖,不能保證不可重復讀
3、三級封鎖協議:
???????? 在一級封鎖協議基礎上增加事務T在讀取數據R之前必須先對其加S鎖,直到事務結束后釋放。
三級封鎖協議除了可以防止丟失修改和讀臟數據外,還防止了不可重復讀
三級封鎖協議的主要區別是什么操作需要申請鎖,何時釋放鎖。封鎖協議越高,一致性程度越高。
?
饑餓
?
饑餓:事務T1封鎖了數據R,事務T2又請求封鎖R,于是T2等待。T3也請求封鎖R,當T1釋放了R上的封鎖之后,系統首先批準了T3的請求,T2仍然等待。 T4又請求封鎖R,當T3釋放了R上的封鎖之后系統又批準了T4的請求……T2有可能永遠等待,這就是饑餓的情形
避免饑餓的方法:先來先服務
當多個事務請求封鎖同一數據對象時,按請求封鎖的先后次序對這些事務排隊
該數據對象上的鎖一旦釋放,首先批準申請隊列中第一個事務獲得鎖。
?
死鎖
?
死鎖:事務T1封鎖了數據R1, T2封鎖了數據R2。 T1又請求封鎖R2,因T2已封鎖了R2,于是T1等待T2釋放R2上的鎖。 接著T2又申請封鎖R1,因T1已封鎖了R1,T2也只能
等待T1釋放R1上的鎖。 這樣T1在等待T2,而T2又在等待T1,T1和T2兩個事務永遠不能結束,形成死鎖。
解決死鎖的方法:預防、診斷和解除
1、死鎖的預防
產生死鎖的原因是兩個或多個事務都已經封鎖了一些數據對象,然后又都請求對已被其他事務封鎖的數據對象加鎖,從而出現死等待。
預防死鎖發生就是破壞產生死鎖的條件
方法
1)一次封鎖法:
???????? 要求每個事務必須一次將所有要使用的數據全部加鎖,否則就不能繼續執行。
???????? 存在的問題:降低系統的并發度;難以實現精確確定封鎖對象
2)順序封鎖法:
???????? 預先對數據對象規定一個封鎖順序,所有事務都按這個順序實施封鎖。
???????? 存在的問題:
維護成本:數據庫系統中的封鎖對象極多,并且在不斷地變化
難以實現:很難實現確定每一個事務要封鎖哪些對象
DBMS普通采用的診斷并解除死鎖的方法
2、死鎖的診斷和解除
???????? 方法:超時法和事務等待圖法
???????? 1)超時法:如果一個事務的等待時間超過了規定的時限,就認為發生了死鎖
????????????????? 優點:實現簡單
????????????????? 缺點:誤判死鎖;時限若設置太長,死鎖發生后不能及時發現。
???????? 2)事務等待圖法:用事務等待圖動態反映所有事務的等待情況事務
等待圖是一個有向圖G=(T,U),T為結點的集合,每個結點表示正運行的事務, U為邊的集合,每條邊表示事務等待的情況。若T1等待T2,則T1、T2之間劃一條有向邊,從T1指向T2。
并發控制子系統周期性地(比如每隔數秒)生成事務等待圖,檢測事務。如果發現圖中存在回路,則表示系統中出現了死鎖。? ??
解除死鎖:并發控制子系統選擇一個處理死鎖代價最小的事務,將其撤銷。
釋放該事務持有的所有的鎖,使其他事務能夠繼續運行下去。
?
?
串行調度
什么樣的調度是正確的?串行調度是正確的。
(執行結果等價于串行調度的調度也是正確的,這樣的調度稱為可串行化調度。)
可串行化調度
定義:多個事務的并發執行是正確的,當且僅當其結果與按某一次序串行地執行這些事務時的結果相同,稱這種調度策略為可串行化調度(serializable)。
可串行性是并發事務正確調度的準則。按這個準則規定,一個給定的并發調度,當且僅當它是可串行化的,才認為是正確調度。
沖突可串行化調度
判斷可串行化調度的充分條件
沖突操作:不同的事務對同一個數據的讀寫和寫寫操作。
不同事務的沖突操作和同一事務的兩個操作是不能交換的。
Ri(x)和Wj(x)不可交換,Wi(x)和Wj(x)不可交換
沖突可串行化調度:
一個調度Sc在保證沖突操作的次序不變的情況下,通過交換兩個事務不沖突操作的次序得到另一個調度Sc’,如果Sc’是串行的,稱調度Sc為沖突可串行化的調度。
?
兩段鎖協議
DBMS的并發控制機制必須提供一定的手段來保證調度是可串行化的。目前DBMS普遍采用兩段鎖協議(TwoPhase Locking,簡稱2PL)的方法來顯示并發調度的可串行性。
?
兩段鎖協議是指所有事務必須分兩個階段對數據對象進行加鎖和解鎖。
???????? 1)在對任何數據進行讀寫操作以前,首先要申請并獲得對該數據的鎖。
???????? 2)在釋放一個鎖之后,事務不再申請和獲得其他任何的鎖。
“兩段”鎖的含義:事務分為兩個階段
第一階段是獲得封鎖,也稱為擴展階段
事務可以申請獲得任何數據對象上的任何類型的鎖,但是不能釋放任何鎖
第二階段是釋放封鎖,也稱為收縮階段
事務可以釋放任何數據對象上的任何類型的鎖,但是不能再申請任何鎖
?
事務遵守兩段鎖協議是可串行化調度的充分條件,而不是必要條件。
若并發事務都遵守兩段鎖協議,則對這些事務的任何并發調度策略都是可串行化的
若并發事務的一個調度是可串行化的,不一定所有事務都符合兩段鎖協議
?
兩段鎖協議與防止死鎖的一次封鎖法
一次封鎖法要求每個事務必須一次將所有要使用的數據全部加鎖,否則就不能繼續執行,因此一次封鎖法遵守兩段鎖協議
但是兩段鎖協議并不要求事務必須一次將所有要使用的數據全部加鎖,因此遵守兩段鎖協議的事務可能發生死鎖
?
封鎖的粒度
封鎖對象的大小稱為封鎖粒度(granularity)。
封鎖的對象可以是邏輯單元(屬性值、屬性值集合、元組、關系、索引項、數據庫),也可以是物理單元(頁、物理記錄)。
選擇封鎖粒度原則:
???????? 封鎖粒度和系統的并發度和并發控制的開銷密切相關
???????? 封鎖的粒度越大,數據庫所能夠封鎖的數據單元就越少,并發度就越低,系統開銷也
越小;
封鎖的粒度越小,并發度較高,但系統開銷也就越大
?
意向鎖
意向鎖:如果對一個節點加意向鎖,則可說明該節點的下層節點正在被加鎖;對任一節點加鎖時,必須先對它的上層節點加意向鎖。
例如,對任一元組加鎖時,必須先對它所在的數據庫和關系加意向鎖。
三種常用的意向鎖:意向共享鎖(Intent Share Lock,IS鎖);意向排它鎖(Intent Exclusive Lock,IX鎖);共享意向排它鎖(Share Intent Exclusive Lock,SIX鎖)。
?
1、IS鎖
如果對一個數據對象加IS鎖,表示它的子節點擬加S鎖。
例如:事務T1要對R1中某個元組加S鎖,則要首先對關系R1和數據庫加IS鎖
?
2、IX鎖
如果對一個數據對象加IX鎖,表示它的子節點擬加X鎖。
例如:事務T1要對R1中某個元組加X鎖,則要首先對關系R1和數據庫加IX鎖
?
3、SIX鎖
如果對一個數據對象加SIX鎖,表示對它加S鎖,再加IX鎖,即SIX = S + IX。
?
例如:對某個表加SIX鎖,則表示該事務要讀整個表(所以要對該表加S鎖),同
時會更新個別元組(所以要對該表加IX鎖)
意向鎖的強度: 鎖的強度是指它對其他鎖的排斥程度。一個事務在申請封鎖時以強鎖代替弱鎖是安全的,反之則不然。
具有意向鎖的多粒度封鎖方法
申請封鎖時應該按自上而下的次序進行
釋放封鎖時則應該按自下而上的次序進行
優點:
???????? 1)提高了系統并發度
???????? 2)減少了加鎖和解鎖的開銷
在實際的DBMS產品中得到廣泛應用。
?
其他并發控制
并發控制的方法除了封鎖技術外,還有時間戳方法、樂觀控制法和多版本并發控制。
時間戳方法:給每一個事務蓋上一個時標,即事務開始的時間。每個事務具有唯一的時間戳,并按照這個時間戳來解決事務的沖突操作。如果發生沖突操作,就回滾到具有較早時間戳的事務,以保證其他事務的正常執行,被回滾的事務被賦予新的時間戳被從頭開始執行。
樂觀控制法認為事務執行時很少發生沖突,所以不對事務進行特殊的管制,而是讓它自由執行,事務提交前再進行正確性檢查。如果檢查后發現該事務執行中出現過沖突并影響了可串行性,則拒絕提交并回滾該事務。又稱為驗證方法
多版本控制是指在數據庫中通過維護數據對象的多個版本信息來實現高效并發的一種策略。
總結
以上是生活随笔為你收集整理的关系数据库——并发控制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据结构课上笔记7
- 下一篇: redis——数据库