1. 程式人生 > >資料庫併發控制

資料庫併發控制

 

1.  在資料庫中為什麼要併發控制?

答:資料庫是共享資源,通常有許多個事務同時在執行。當多個事務併發地存取資料庫時就會產生同時讀取和/或修改同一資料的情況。若對併發操作不加控制就可能會存取和儲存不正確的資料,破壞資料庫的一致性。所以資料庫管理系統必須提供併發控制機制。

 2 .併發操作可能會產生哪幾類資料不一致?用什麼方法能避免各種不一致的情況?

答:併發操作帶來的資料不一致性包括三類:丟失修改、不可重複讀和讀“髒’夕資料。 ( l )丟失修改(lost update ) 兩個事務 Tl 和T2讀入同一資料並修改,T2提交的結果破壞了(覆蓋了) Tl 提交的結果,導致 Tl 的修改被丟失。 ( 2 )不可重複讀( Non 一 Repeatable Read ) 不可重複讀是指事務 Tl 讀取資料後,事務幾執行更新操作,使 Tl 無法再現前一次讀取結果。( 3 )讀“髒”資料( Dirty Read ) 讀“髒’夕資料是指事務 Tl 修改某一資料,並將其寫回磁碟,事務幾讀取同一資料後, Tl 由於某種原因被撤銷,這時 Tl 已修改過的資料恢復原值,幾讀到的資料就與資料庫中的資料不一致,則幾讀到的資料就為“髒”資料,即不正確的資料。避免不一致性的方法和技術就是併發控制。最常用的技術是封鎖技術。也可以用其他技術,例如在分散式資料庫系統中可以採用時間戳方法來進行併發控制。

3 .什麼是封鎖?基本的封鎖型別有幾種?試述它們的含義。

答:封鎖就是事務 T 在對某個資料物件例如表、記錄等操作之前,先向系統發出請求,對其加鎖。加鎖後事務 T 就對該資料物件有了一定的控制,在事務 T 釋放它的鎖之前,其他的事務不能更新此資料物件。封鎖是實現併發控制的一個非常重要的技術。

基本的封鎖型別有兩種:排它鎖( Exclusive Locks ,簡稱 x 鎖)和共享鎖 ( Share Locks,簡稱 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 做任何修改。

4 .如何用封鎖機制保證資料的一致性?

答: DBMS 在對資料進行讀、寫操作之前首先對該資料執行封鎖操作,例如下圖中事務 Tl 在對 A 進行修改之前先對 A 執行 xock ( A ) ,即對 A 加 x 鎖。這樣,當幾請求對 A 加 x 鎖時就被拒絕,幾隻能等待 Tl 釋放 A 上的鎖後才能獲得對 A 的 x 鎖,這時它讀到的 A 是 Tl 更新後的值,再按此新的 A 值進行運算。這樣就不會丟失 Tl 的更新。

DBMS 按照一定的封鎖協議,對併發操作進行控制,使得多個併發操作有序地執行,就可以避免丟失修改、不可重複讀和讀“髒’夕資料等資料不一致性。

5 .什麼是活鎖?什麼是死鎖?

答:

如果事務 Tl 封鎖了資料 R ,事務幾又請求封鎖 R ,於是幾等待。幾也請求封鎖 R ,當 Tl 釋放了 R 上的封鎖之後系統首先批准了幾的請求,幾仍然等待。然後幾又請求封鎖 R ,當幾釋放了 R 上的封鎖之後系統又批准了幾的請求 … … 幾有可能永遠等待,這就是活鎖的情形。活鎖的含義是該等待事務等待時間太長,似乎被鎖住了,實際上可能被啟用。如果事務 Tl 封鎖了資料 Rl ,幾封鎖了資料凡,然後 Tl 又請求封鎖幾,因幾已封鎖了幾,於是 Tl 等待幾釋放几上的鎖。接著幾又申請封鎖 Rl ,因 Tl 已封鎖了 Rl ,幾也只能等待 Tl 釋放 Rl 上的鎖。這樣就出現了 Tl 在等待幾,而幾又在等待 T }的局面, T }和幾兩個事務永遠不能結束,形成死鎖。

6 .試述活鎖的產生原因和解決方法。

答:活鎖產生的原因:當一系列封鎖不能按照其先後順序執行時,就可能導致一些事務無限期等待某個封鎖,從而導致活鎖。避免活鎖的簡單方法是採用先來先服務的策略。當多個事務請求封鎖同一資料物件時,封鎖子系統按請求封鎖的先後次序對事務排隊,資料物件上的鎖一旦釋放就批准申請佇列中第一個事務獲得鎖。

11 .請給出檢測死鎖發生的一種方法,當發生死鎖後如何解除死鎖?

答:資料庫系統一般採用允許死鎖發生, DBMS 檢測到死鎖後加以解除的方法。 DBMS 中診斷死鎖的方法與作業系統類似,一般使用超時法或事務等待圖法。超時法是:如果一個事務的等待時間超過了規定的時限,就認為發生了死鎖。超時法實現簡單,但有可能誤判死鎖,事務因其他原因長時間等待超過時限時,系統會誤認為發生了死鎖。若時限設定得太長,又不能及時發現死鎖發生。 DBMS 併發控制子系統檢測到死鎖後,就要設法解除。通常採用的方法是選擇一個處理死鎖代價最小的事務,將其撤消,釋放此事務持有的所有鎖,使其他事務得以繼續執行下去。當然,對撤銷的事務所執行的資料修改操作必須加以恢復。

 12 .什麼樣的併發排程是正確的排程?

答:可序列化( Serializable )的排程是正確的排程。可序列化的排程的定義:多個事務的併發執行是正確的,當且僅當其結果與按某一次序序列執行它們時的結果相同,稱這種排程策略為可序列化的排程。

9 .設 Tl ,幾,幾是如下的 3 個事務:

Tl :A : = A + 2 ;

T2:A : = A * 2 ;

T3:A : = A **2 ; ( A <-A*A)

設 A 的初值為 0 。

( l )若這 3 個事務允許並行執行,則有多少可能的正確結果,請一一列舉出來。

答 :A 的最終結果可能有 2 、 4 、 8 、 16 。因為序列執行次序有 Tl T2T3、 Tl T3T2、T2T1T3、T2T3Tl 、T3T1T2、T3T2 Tl 。對應的執行結果是 16 、 8 · 4 · 2 · 4 · 2 。

( 2 )請給出一個可序列化的排程,並給出執行結果

答:

最後結果 A 為 16 ,是可序列化的排程。

( 3 )請給出一個非序列化的排程,並給出執行結果。

答:

         

      最後結果 A 為 0 ,為非序列化的排程。

( 4 )若這 3 個事務都遵守兩段鎖協議,請給出一個不產生死鎖的可序列化排程。

答:

         

     ( 5 )若這 3 個事務都遵守兩段鎖協議,請給出一個產生死鎖的排程。

答:

         

11.試證明,若併發事務遵守兩段鎖協議,則對這些事務的併發排程是可序列化的。

證明:首先以兩個併發事務 Tl 和T2為例,存在多個併發事務的情形可以類推。根據可序列化定義可知,事務不可序列化只可能發生在下列兩種情況:

 ( l )事務 Tl 寫某個資料物件 A ,T2讀或寫 A ;

( 2 )事務 Tl 讀或寫某個資料物件 A ,T2寫 A 。

下面稱 A 為潛在衝突物件。

設 Tl 和T2訪問的潛在衝突的公共物件為{A1,A2 … , An }。不失一般性,假設這組潛在衝突物件中 X =(A 1 , A2 , … , Ai }均符合情況 1 。 Y ={A i + 1 , … , An }符合所情況( 2 )。

VX ∈ x , Tl 需要 XlockX ①

T2 需要 Slockx 或 Xlockx ②

 1 )如果操作 ① 先執行,則 Tl 獲得鎖,T2等待

由於遵守兩段鎖協議, Tl 在成功獲得 x 和 Y 中全部物件及非潛在衝突物件的鎖後,才會釋放鎖。

這時如果存在 w ∈ x 或 Y ,T2已獲得 w 的鎖,則出現死鎖;否則, Tl 在對 x 、 Y 中物件全部處理完畢後,T2才能執行。這相當於按 Tl 、T2的順序序列執行,根據可序列化定義, Tl 和幾的排程是可序列化的。

2 )操作 ② 先執行的情況與( l )對稱因此,若併發事務遵守兩段鎖協議,在不發生死鎖的情況下,對這些事務的併發排程一定是可序列化的。證畢。

12 .舉例說明,對併發事務的一個排程是可序列化的,而這些併發事務不一定遵守兩段鎖協議。

答:

 

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 。

相容矩陣:

 

15 .理解並解釋下列術語的含義:封鎖、活鎖、死鎖、排它鎖、共享鎖、併發事務的排程、可序列化的排程、兩段鎖協議。

答:(略,已經在上面有關習題中解答)

16 .試述你瞭解的某一個實際的 DBMS 產品的併發控制機制。

答:(略,參見簡單介紹了有關 Oracle 的併發控制機制。