第11章 並發控制
了解
- 數據庫並發控制技術的必要性
- 活鎖與死鎖的概念
掌握
- 並發操作可能產生數據不一致的情況,包括丟失修改、不可重復讀、讀“臟”數據等
- 封鎖的類型及不同封鎖類型(X鎖、S鎖)的性質和定義,相關的相容控制矩陣
- 封鎖協議的概念
- 封鎖粒度的概念,多粒度封鎖方法,多粒度封鎖協議的相容控制矩陣
- 封鎖協議與數據一致性的關系,並發調度的可串行性概念
- 兩段鎖協議與可串行性的關系,兩段鎖協議與死鎖的關系
知識點
- 在數據庫中為什么要並發控制?並發控制技術能保證事務的哪些特性?
- 數據庫是共享資源,通常有許多個事務同時在運行。當多個事務並發地存取數據庫時就會產生同時讀取和/或修改同一數據的情況。若對並發操作不加控制就可能會存取和存儲不正確的數據,破壞數據庫的一致性。所以數據庫管理系統必須提供並發控制機制。
- 並發控制可以保證事務的【一致性】和【隔離性】
- 並發操作帶來的數據不一致性包括三類
- 丟失修改(LostUpdate)
兩個事務T1和T2讀入同一數據並修改,T2提交的結果破壞了(覆蓋了)T1提交的結果,導致T1的修改被丟失。 - 不可重復讀(Non-RepeatableRead)
不可重復讀是指事務T1讀取數據后,事務T2執行更新操作,使T1無法再現前一次讀取結果。不可重復讀包括三種情況1.事務T1讀取某一數據后,事務T2對其做了修改,當事務T1再次讀改數據時,得到與前一次不同的值2.事務T1按一定條件從數據庫中讀取了某些數據記錄后,事務T2刪除了其中部分記錄,當T1再次按相同條件讀取數據時,發現某些記錄消失了3.事務T1按一條件從數據庫中讀取某些數據記錄后,事務T2插入了一些記錄,當T1再次按相同條件讀取數據時,發現多了一些記錄后兩種不可重復讀有時也稱為幻影(phantom row)現象 - 讀“臟”數據(DirtyRead)
讀“臟”數據是指事務T1修改某一數據,並將其寫回磁盤,事務T2讀取同一數據后,T1由於某種原因被撤銷,這時T1已修改過的數據恢復原值,T2讀到的數據就與數據庫中的數據不一致,則T2讀到的數據就為“臟”數據,即不正確的數據。
- 丟失修改(LostUpdate)
- 避免不一致性的方法和技術就是並發控制。常用的並發控制技術包括封鎖技術、時間戳方法、樂觀控制方法、多版本並發控制方法等
- 封鎖就是事務T在對某個數據對象例如表、記錄等操作之前,先向系統發出請求,對其加鎖。加鎖后事務T就對該數據對象有了一定的控制,在事務T釋放它的鎖之前,其他的事務不能更新此數據對象。
- 基本的封鎖類型有兩種: 排它鎖(簡稱X鎖) 和共享鎖(簡稱S鎖)。
- 排它鎖又稱為寫鎖。若事務T對數據對象A加上X鎖,則只允許T讀取和修改A,其他任何事務都不能再對A加任何類型的鎖,直到T釋放A上的鎖。這就保證了其他事務在T釋放A上的鎖之前不能再讀取和修改A。
- 共享鎖又稱為讀鎖。若事務T對數據對象A加上S鎖,則事務T可以讀A但不能修改A,其他事務只能再對A加S鎖,而不能加X鎖,直到T釋放A上的S鎖。這就保證了其他事務可以讀A,但在T釋放A上的S鎖之前不能對A做任何修改。
- DBMS在對數據進行讀寫操作之前首先對該數據執行封鎖操作
-
- 活鎖產生的原因:當一系列封鎖不能按照其先后順序執行時,就可能導致一些事務無限期等待某個封鎖,從而導致活鎖。
- 避免活鎖的簡單方法是采用先來先服務的策略。當多個事務請求封鎖同一數據對象時,封鎖子系統按請求封鎖的先后次序對事務排隊,數據對象上的鎖一旦釋放就批准申請隊列中第一個事務獲得鎖。
- 在數據庫中,產生死鎖的原因是兩個或多個事務都已封鎖了一些數據對象,然后又都請求已被其他事務封鎖的數據加鎖,從而出現死等待。防止死鎖的發生其實就是要破壞產生死鎖的條件。預防死鎖通常有兩種方法:
-
- 一次封鎖法
要求每個事務必須一次將所有要使用的數據全部加鎖,否則就不能繼續執行。 - 順序封鎖法
預先對數據對象規定一個封鎖順序,所有事務都按這個順序實行封鎖。
- 一次封鎖法
- 數據庫系統一般采用允許死鎖發生,DBMS檢測到死鎖后加以解除的方法。
- DBMS中診斷死鎖的方法與操作系統類似,一般使用超時法或事務等待圖法。
- 超時法:如果一個事務的等待時間超過了規定的時限,就認為發生了死鎖。
- DBMS並發控制子系統檢測到死鎖后,就要設法解除。通常采用的方法是選擇一個處理死鎖代價最小的事務,將其撤消,釋放此事務持有的所有鎖,使其他事務得以繼續運行下去。
- 可串行化的調度是正確的調度。
- 可串行化的調度的定義:多個事務的並發執行是正確的,當且僅當其結果與按某一次序串行地執行它們時的結果相同,我們稱這種調度策略為可串行化的調度。
- 綜合題
-
- 證明題
-
-
-
為什么要引進意向鎖? 意向鎖的含義是什么?
-
- 引進意向鎖是為了提高封鎖子系統的效率。
- 原因是:在多粒度封鎖方法中,一個數據對象可能以兩種方式加鎖—顯式封鎖和隱式封鎖。因此系統在對某一數據對象加鎖時不僅要檢查該數據對象上有無(顯式和隱式)封鎖與之沖突;還要檢查其所有上級結點和所有下級結點,看申請的封鎖是否與這些結點上的(顯式和隱式)封鎖沖突;顯然,這樣的檢查方法效率很低。為此引進了意向鎖。
- 意向鎖的含義是:對任一結點加鎖時,必須先對它的上層結點加意向鎖。引進意向鎖后,系統對某一數據對象加鎖時不必逐個檢查與下一級結點的封鎖沖突了。
- 試述常用的意向鎖:IS鎖,IX鎖,SIX鎖,給出這些鎖的相容矩陣。
- IS鎖:如果對一個數據對象加IS鎖,表示它的后裔結點擬(意向)加S鎖。例如,要對某個元組加S鎖,則要首先對關系和數據庫加IS鎖
- IX鎖:如果對一個數據對象加IX鎖,表示它的后裔結點擬(意向)加X鎖。例如,要對某個元組加X鎖,則要首先對關系和數據庫加IX鎖。
- SIX鎖:如果對一個數據對象加SIX鎖,表示對它加S鎖,再加IX鎖,即SIX = S + IX。
- 相容矩陣
補充
-
- 試述兩段鎖協議的概念。
- 兩段鎖協議是指所有事務必須分兩個階段對數據項加鎖和解鎖。
- 在對任何數據進行讀、寫操作之前,首先要申請並獲得對該數據的封鎖;
- 在釋放一個封鎖之后,事務不再申請和獲得任何其他封鎖。
- “兩段”的含義是,事務分為兩個階段:
- 第一階段是獲得封鎖,也稱為擴展階段。在這階段,事務可以申請獲得任何數據項上的任何類型的鎖,但是不能釋放任何鎖。
- 第二階段是釋放封鎖,也稱為收縮階段。在這階段,事務釋放已經獲得的鎖,但是不能再申請任何鎖。
- 兩段鎖協議是指所有事務必須分兩個階段對數據項加鎖和解鎖。
- 不同封鎖協議與系統一致性級別的關系是什么?
- 不同的封鎖協議對應不同的一致性級別。
- 一級封鎖協議可防止丟失修改,並保證事務T是可恢復的。在一級封鎖協議中,對讀數據是不加S鎖的,所以它不能保證可重復讀和不讀“臟”數據。
- 二級封鎖協議除防止了丟失修改,還可進一步防止讀“臟”數據。在二級封鎖協議中,由於讀完數據后立即釋放S鎖,所以它不能保證可重復讀。
- 在三級封鎖協議中,無論是讀數據還是寫數據都加長鎖,即都要到事務結束時才釋放封鎖。所以三級封鎖協議除防止了丟失修改和不讀“臟”數據外,還進一步防止了不可重復讀。
- 什么是封鎖協議?不同級別的封鎖協議的主要區別是什么?
- 在運用封鎖技術對數據加鎖時,要約定一些規則。例如,在運用X鎖和S鎖對數據對象加鎖時,要約定何時申請X鎖或S鎖、何時釋放封鎖等。這些約定或者規則稱為封鎖協議(Locking Protocol)。對封鎖方式約定不同的規則,就形成了各種不同的封鎖協議。不同級別的封鎖協議,例如《概論》中介紹的三級封鎖協議,三級協議的主要區別在於什么操作需要申請封鎖,何時申請封鎖以及何時釋放鎖(即持鎖時間的長短)。
- 一級封鎖協議:事務T在修改數據R之前必須先對其加X鎖,直到事務結束才釋放。
- 二級封鎖協議:一級封鎖協議加上事務T在讀取數據R之前必須先對其加S鎖,讀完后即可釋放S鎖。
- 三級封鎖協議:一級封鎖協議加上事務T在讀取數據R之前必須先對其加S鎖,直到事務結束才釋放。
- 意向鎖中為什么存在SIX鎖,而沒有XIS鎖
- 完整性約束是否能夠保證數據庫在處理多個事務時處於一致狀態
- 綜合題
- 為了防止一個用戶的工作不適當地影響另一個用戶,應該采取【並發控制】
- 解決並發操作帶來的數據不一致問題普遍采用【封鎖】技術。
- 下列不屬於並發操作帶來的問題是【死鎖】
- DBMS普遍采用【封鎖】方法來保證調度的正確性
- 事務T在修改數據R之前必須先對其加X鎖,直到事務結束才釋放,這是【一級封鎖協議】
- 如果事務T獲得了數據項Q上的排他鎖,則T對Q【既可讀又可寫】
- 設事務T1和T2,對數據庫中地數據A進行操作,可能有如下幾種情況,請問哪一種不會發生沖突操作【T1正在讀A,T2也要讀A】
- 如果有兩個事務,同時對數據庫中同一數據進行操作,不會引起沖突的操作是【兩個都是SELECT】
- 在數據庫系統中,死鎖屬於【事務故障】
- 試述兩段鎖協議的概念。
