應試筆記9:併發控制、封鎖、死鎖和活鎖、併發調度的可串行性、兩段鎖協議、意向鎖

併發控制機制的任務

對併發操作進行正確調度;保證事務的隔離性;保證數據庫的一致性

數據不一致性:由於併發操作破壞了事務的隔離性

併發控制就是要用正確的方式調度併發操作,使一個用戶事務的執行不受其他事務的干擾,從而避免造成數據的不一致性

併發控制帶來的問題

併發操作帶來的數據不一致性

丟失修改(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鎖)。

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章