資料庫的並發控制和封鎖協議分析,資料庫封鎖協議分析

來源:互聯網
上載者:User

資料庫的並發控制和封鎖協議分析,資料庫封鎖協議分析

                                                                                  資料庫的並發控制和封鎖協議分析

 

[摘 要] 資料庫可以提供給多個使用者共用資料資訊資源,所以就必須對並發的事務進行控制,這種並發控制必須引入一些封鎖協議以保證資料的完整性。本文針對資料庫並行作業中可能產生的資料不一致性問題進行分析,並給出解決的方法。

[關鍵詞] 資料庫 並發控制 一致性 封鎖 封鎖協議

一、引言

目前主流的關聯式資料庫通常都允許多個使用者同時使用和共用,所以也都具有並發控制的機制,也就是控制資料庫,防止多使用者並發使用資料庫時造成資料錯誤和程式運行錯誤,以保證資料的完整性。

二、事務與並發控制的概念

當多使用者並發存取資料時,就會產生多個事務同時存取同一資料的情況,從而引起嚴重的資料錯誤和程式運行錯誤。那麼我們來看,什麼是事務及並發控制呢?

事務就是使用者定義的一個資料庫操作序列,這些操作要麼全做,要麼全不做,是一個不可分割的很小的工作單位。例如,在SQL語言中,定義事務的語句有三條:

BEGINTRANSACTION;

COMMIT;

ROLLBACK;

其中的BEGINTRANSACTION 是事務開始的標記,而以COMMIT或者ROLLBACK結束,COMMIT 用於提交事務的所有操作,ROLLBACK 則在事務運行過程中一旦發生了某種故障而使事務無法繼續執行的時候,系統就將事務中對資料庫的所有剛剛完成的操作全部撤消,滾動回到事務開始時的狀態。為了充分利用系統資源,使資料庫的共用資源得以有效利用,必須可以使多個事務並行的執行,而資料庫對並存執行的事務進行的控制就是並發控制。

三、事務進行並行作業可能引起的資料不一致問題

由於種種原因,都可能引起資料庫的資料遭到破壞,比如多個事務在並行啟動並執行時候,不同的事務的操作產生了交叉執行,或者,事務在運行過程中被強行停或者中斷。因此,事務在進行並行作業的時候很可能引起資料的不一致,下面我們看一個具體的例子。例如飛機票的連網銷售系統,如果有以下的操作序列:

1.甲售票處(設定為T1 事務)讀出某班次的機票剩餘數A ,

設A=20

2.乙售票處(設定為T2 事務)讀出同班次的機票剩餘數A ,也是20

3.甲售票處(T1 事務)賣出一張機票,修改剩餘數減一(A← A-1),把A=19 寫回資料庫中

4.乙售票處(T2 事務)也賣出一張機票,修改剩餘數減一(A← A-1),把A=19 寫回資料庫中從這些操作中,我們看到,乙售票處的修改資料覆蓋了甲售票處修改的資料,實際發生了兩張機票的銷售,而資料庫中卻錯誤的存入19,少了一張。參看圖1 的情況。這種情況是並行作業引起資料不一致的第一種情況,叫做丟失修改(Lost Update),第二種是不可重複讀取(Non-Repeatable Read),

第三種是讀“髒”資料(DirtyRead)。

 

 

下邊看第二種情況,不可重複讀取是指事務T1 讀資料以後,T2執行更新操作,就使T1無法再現原先讀取的資料,得到與上一次不同的結果,例2 。


讀“髒”資料是指T1 修改某資料並將其寫回資料庫,T2 讀取同一資料後,T1 由於某種原因被撤消,T1 執行復原,恢複到原始的資料,T2 就讀取到了過程中的一個作廢的資料,這個資料就是一種垃圾資料,稱之為“髒”資料,也是不正確的。參看圖3 。


從以上例子我們看到,資料不一致性的主要原因就是並行作業沒有對事務進行一定的隔離,所以,正確的調度應該使一個使用者的事務不受到其他事務的幹擾,從而避免資料的不一致性。

四、在並發控制中採用封鎖協議解決資料的不一致性並發控制的主要方法是封鎖(Locking)。就是要用正確的方式調度並行作業,使一個使用者的事務在執行過程中不受其他事務的幹擾,從而避免造成資料的不一致性。封鎖是使事務對它要操作的資料有一定的控制能力。封鎖通常具有3 個環節:第一個環節是申請加鎖,即事務在操作前要對它將使用的資料提出加鎖申請; 第二個環節是獲得鎖,即當條件成熟時,系統允許事務對資料進行加鎖,從而事務獲得資料的控制

權;第三個環節是釋放鎖,即完成操作後事務放棄資料的控制權。

基本的封鎖類型有以下兩種:

1.排它鎖(Exclusive Locks,簡稱X鎖)

排它鎖也稱為獨佔鎖或寫鎖。一旦事務T 對資料對象A 加上排它鎖(X 鎖),則只允許T 讀取和修改A ,其他任何事務既不能讀取和修改A ,也不能再對A 加任何類型的鎖,直到T釋放A 上的鎖為止。

2.共用鎖定(Share Locks,簡稱S 鎖)

共用鎖定又稱讀鎖。如果事務T 對資料對象A 加上共用鎖定(S鎖),其他事務只能再對A加S 鎖,不能加X 鎖,直到事務T 釋放A 上的S 鎖為止。在對資料進行加鎖時,另外需要約定並執行一些規則和協議,其中包括何時申請鎖,保持鎖的時間以及何時釋放等,這些規則就稱為封鎖協議(Locking Protocol),其總共分為以下三級:

(1)一級封鎖協議。一級封鎖協議是事務T 在修改資料之前必須先對其加X 鎖,直到事務結束才釋放。

(2)二級封鎖協議。二級封鎖協議是事務T 對要修改資料必須先加X 鎖,直到事務結束才釋放X 鎖;對要讀取的資料必須先加S 鎖,讀完後即可釋放S 鎖。

(3)三級封鎖協議。三級封鎖協議是事務T 在讀取資料之前必須先對其加S 鎖,在要修改資料之前必須先對其加X 鎖,直到事務結束後才釋放所有鎖。

執行了封鎖協議之後,就可以克服資料庫操作中的資料不一致所引起的問題。

 

從圖4 的情況我們看到事務T1 在執行過程中獨自佔用並加X鎖,直到處理完之後再釋放鎖,T2 雖然也需要使用,但是在封鎖協議的約束之下,T2 所要求的X 鎖就被拒絕,因此必須處於等待狀態,直到T1 釋放之後,T2 才獲得使用的權利,這樣就不會發生使用衝突,避免了資料的丟失。這裡我們看到,此處實際上是執行了一級封鎖協議。


通過圖5 ,能夠清楚的看到,由於施行了封鎖協議,使事務T1 使用了共用鎖定佔用A,B 兩塊資料,這樣T2 需要加上的X 鎖就無法實現,(如果是S 鎖,雖然可以加上,但也不能夠隨便修改資料,只是讀取一下資料。)當T1 釋放鎖之後,T2 就可以得到並使用鎖了,這樣讀取的資料B 仍然還是100,不影響A+B 的結果,這就是可重複讀取。因此我們看到,其實這裡用的就是三級封鎖協議參看圖6,事務T1 在對資料C 修改之前,先加上了X鎖,修改後寫回資料庫,這時T2 請求在C上添加S 鎖,因為T1 加了X 鎖,T2隻好等待,當T1 因為某種原因撤銷了修改的資料後,C 就恢複了原來的資料100,等T1 釋放X 鎖後T2 獲得C 上的S鎖, 讀到的還是C = 1 0 0,因此避免了讀出“髒”資料。這裡使用的其實就是二級封鎖協議。。


通過以上內容,資料庫由於採用一定的封鎖協議避免了資料的不一致性問題,這使得資料庫的並發控制有效而且有益,從而使得多項事務可以並行的操作資料庫的共用資源了。這就是資料庫合理的進行調度,避免了衝突,避免了資料的不一致。

參考文獻:

[1]苗雪蘭:資料庫系統原理及應用教程[M].北京:機械工業出版社,2004

[2](美)Mary Pyefinch著:希望圖書創作室譯[M].SQL資料庫開發從入門到精[M].北京希望電子出版社,2000[3]丁寶康 董健全:資料庫使用教程[M].北京:清華大學出版社,2001

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.