1. 在資料庫中為什麼要並發控制?
答:資料庫是共用資源,通常有許多個事務同時在運行。
當多個事務並發地存取資料庫時就會產生同時讀取和/或修改同一資料的情況。若對並行作業不加控制就可能會存取和儲存不正確的資料,破壞資料庫的一致性。所以資料庫管理系統必須提供並發控制機制。
2.並行作業可能會產生哪幾類資料不一致?用什麼方法能避免各種不一致的情況?
答:並行作業帶來的資料不一致性包括三類:丟失修改、不可重複讀取和讀 “髒”資料。
( 1)丟失修改(Lost Update)
兩個事務 T1和T2讀入同一資料並修改,T2提交的結果破壞了(覆蓋了)T1提交的結果,導致T1的修改被丟失。
( 2)不可重複讀取(Non-RepeatableRead)
不可重複讀取是指事務 T1讀取資料後,事務T2執行更新操作,使T1無法再現前一次讀取結果。
( 3)讀“髒”資料(DirtyRead)
讀“髒”資料是指事務T1修改某一資料,並將其寫回磁碟,事務T2讀取同一資料後,T1由於某種原因被撤銷,這時T1已修改過的資料恢複原值,T2讀到的資料就與資料庫中的資料不一致,則T2讀到的資料就為“髒”資料,即不正確的資料。
避免不一致性的方法和技術就是並發控制。最常用的並發控制技術是封鎖技術。
也可以用其他技術,例如在分散式資料庫系統中可以採用時間戳記方法來進行並發控制。
3. 什麼是封鎖?
答:封鎖就是事務T在對某個資料對象例如表、記錄等操作之前,先向系統發出請求,對其加鎖。加鎖後事務T就對該資料對象有了一定的控制,在事務T釋放它的鎖之前,其他的事務不能更新此資料對象。
封鎖是實現並發控制的一個非常重要的技術。
3. 基本的封鎖類型有幾種?試述它們的含義。
答:基本的封鎖類型有兩種 :排它鎖(Exclusive Locks,簡稱X鎖) 和共用鎖定(ShareLocks,簡稱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做任何修改。
5.什麼是封鎖協議?不同層級的封鎖協議的主要區別是什嗎?
答:在運用封鎖技術對資料加鎖時,要約定一些規則。例如,在運用X鎖和S鎖對資料對象加鎖時,要約定何時申請X鎖或S鎖、何時釋放封鎖等。這些約定或者規則稱為封鎖協議(LockingProtocol)。對封鎖方式約定不同的規則,就形成了各種不同的封鎖協議。不同層級的封鎖協議,例如《概論》中介紹的三級封鎖協議,三級協議的主要區別在於什麼操作需要申請封鎖,何時申請封鎖以及何時釋放鎖(即持鎖時間的長短)。
一級封鎖協議:事務 T在修改資料R之前必須先對其加X鎖,直到事務結束才釋放。
二級封鎖協議:一級封鎖協議加上事務T在讀取資料R之前必須先對其加S鎖,讀完後即可釋放S鎖。
三級封鎖協議:一級封鎖協議加上事務T在讀取資料R之前必須先對其加S鎖,直到事務結束才釋放。
6. 不同封鎖協議與系統一致性層級的關係是什嗎?
答:不同的封鎖協議對應不同的一致性層級。
一級封鎖協議可防止丟失修改,並保證事務T是可恢複的。在一級封鎖協議中,對讀資料是不加S鎖的,所以它不能保證可重複讀和不讀“髒”資料。
二級封鎖協議除防止了丟失修改,還可進一步防止讀“髒”資料。在二級封鎖協議中,由於讀完資料後立即釋放S鎖,所以它不能保證可重複讀。
在三級封鎖協議中,無論是讀資料還是寫資料都加長鎖,即都要到事務結束時才釋放封鎖。所以三級封鎖協議除防止了丟失修改和不讀“髒”資料外,還進一步防止了不可重複讀取。
7. 試述活鎖的產生原因和解決方案。
答:活鎖產生的原因:當一系列封鎖不能按照其先後順序執行時,就可能導致一些事務無限期等待某個封鎖,從而導致活鎖。
避免活鎖的簡單方法是採用先來先服務的策略。當多個事務請求封鎖同一資料對象時,封鎖子系統按請求封鎖的先後次序對事務排隊,資料對象上的鎖一旦釋放就批准申請隊列中第一個事務獲得鎖。
8. 請給出預防死結的若干方法。
答:在資料庫中,產生死結的原因是兩個或多個事務都已封鎖了一些資料對象,然後又都請求已被其他事務封鎖的資料加鎖,從而出現死等待。
防止死結的發生其實就是要破壞產生死結的條件。預防死結通常有兩種方法:
( 1)一次封鎖法
要求每個事務必須一次將所有要使用的資料全部加鎖,否則就不能繼續執行。
( 2)順序封鎖法
預先對資料對象規定一個封鎖順序,所有事務都按這個順序實行封鎖。
不過,預防死結的策略不大適合資料庫系統的特點。
9.請給出檢測死結發生的一種方法,當發生死結後如何解除死結?
答:資料庫系統一般採用允許死結發生, DBMS檢測到死結後加以解除的方法。
DBMS中診斷死結的方法與作業系統類似,一般使用逾時法或事務等待圖法。
逾時法是:如果一個事務的等待時間超過了規定的時限,就認為發生了死結。逾時法實現簡單,但有可能誤判死結,事務因其他原因長時間等待超過時限時,系統會誤認為發生了死結。若時限設定得太長,又不能及時發現死結發生。
DBMS並發控制子系統檢測到死結後,就要設法解除。通常採用的方法是選擇一個處理死結代價最小的事務,將其撤消,釋放此事務持有的所有鎖,使其他事務得以繼續運行下去。當然,對撤銷的事務所執行的資料修改操作必須加以恢複。
10. 什麼樣的並發調度是正確的調度?
答:可序列化( Serializable)的調度是正確的調度。
可序列化的調度的定義:多個事務的並發執行是正確的,若且唯若其結果與按某一次序串列地執行它們時的結果相同,我們稱這種調度策略為可序列化的調度。
11. 試述兩段鎖協議的概念。
答:兩段鎖協議是指所有事務必須分兩個階段對資料項目加鎖和解鎖。
· 在對任何資料進行讀、寫操作之前,首先要申請並獲得對該資料的封鎖;
· 在釋放一個封鎖之後,事務不再申請和獲得任何其他封鎖。
“兩段”的含義是,事務分為兩個階段:
第一階段是獲得封鎖,也稱為擴充階段。在這階段,事務可以申請獲得任何資料項目上的任何類型的鎖,但是不能釋放任何鎖。
第二階段是釋放封鎖,也稱為收縮階段。在這階段,事務釋放已經獲得的鎖,但是不能再申請任何鎖。
13. 為什麼要引進意圖鎖定? 意圖鎖定的含義是什嗎?
答:引進意圖鎖定是為了提高封鎖子系統的效率。該封鎖子系統支援多種封鎖粒度。
原因是:在多粒度封鎖方法中一個資料對象可能以兩種方式加鎖—顯式封鎖和隱式封鎖。因此系統在對某一資料對象加鎖時不僅要檢查該資料對象上有無(顯式和隱式)封鎖與之衝突;還要檢查其所有上級結點和所有下級結點,看申請的封鎖是否與這些結點上的(顯式和隱式)封鎖衝突;顯然,這樣的檢查方法效率很低。為此引進了意圖鎖定。
意圖鎖定的含義是:對任一結點加鎖時,必須先對它的上層結點加意圖鎖定。
例如事務T要對某個元組加X鎖,則首先要對關係和資料庫加IX鎖。換言之,對關係和資料庫加IX鎖,表示它的後裔結點—某個元組擬(意向)加X鎖。
引進意圖鎖定後,系統對某一資料對象加鎖時不必逐個檢查與下一級結點的封鎖衝突了。例如,事務T要對關係R加X鎖時,系統只要檢查根結點資料庫和R本身是否已加了不相容的鎖(如發現已經加了IX,則與X衝突),而不再需要搜尋和檢查R中的每一個元組是否加了X鎖或S鎖。
14.試述常用的意圖鎖定:IS鎖,IX鎖,SIX鎖,給出這些鎖的相容矩陣。
答: IS鎖
如果對一個資料對象加 IS鎖,表示它的後裔結點擬(意向)加S鎖。例如,要對某個元組加S鎖,則要首先對關係和資料庫加IS鎖
IX鎖
如果對一個資料對象加 IX鎖,表示它的後裔結點擬(意向)加X鎖。例如,要對某個元組加X鎖,則要首先對關係和資料庫加IX鎖。
SIX鎖
如果對一個資料對象加 SIX鎖,表示對它加S鎖,再加IX鎖,即SIX = S + IX。
相容矩陣(略)