摘要: 在多用戶的數據庫系統中,由于事務的并發性而帶來了三類的并發問題。為解決這些問題,本文介紹了三種事務的并發控制方法:封鎖法、時間印法和樂觀法,并分析了它們的優缺點。
關鍵詞: 并發控制 封鎖 時間印 樂觀
1.引言
在數據庫環境中,事務是一個十分重要的概念。一個事務是由一系列的對數據庫的查詢操作和更新操作構成的。這些操作是一個整體,不能分割,即要么所有的操作都順利完成,要么一個也不要做。絕不能只完成了部分操作,而還有一些操作沒有完成。
而事務的并發控制則是通過調度來確保事務的并發執行的效果等同于沒有并發執行時的執行效果,也就是使事務的并發執行調度等價于事務的某個可串行化調度,從而確保數據庫的一致性,其作用是正確協調同一時間里多個事務對數據庫的并發操作,解決資源競爭問題以保證數據庫的一致性和完整性。
2.三類并發問題
并發是多個事務同時存取數據庫同一數據時可能會導致數據存取不一致,數據不真實的現象。并發將引起數據爭用,可導致丟失更新、讀臟數據、不可重復讀三類錯誤,破壞數據的一致性。(如表一所示)
2.1丟失更新:當兩個或多個事務選擇同一行,然后基于最初選定的值更新該行時,會發生丟失更新問題。每個事務都不知道其它事務的存在。最后的更新將重寫由其它事務所做的更新,這將導致數據丟失。(如表二所示)
2.2讀臟數據:當第二個事務選擇其它事務正在更新的行時,第二個事務正在讀取的數據還沒有確認,并且可能由更新此行的事務所更改。
2.3不可重復讀:當第二個事務多次訪問同一行而且每次讀取不同的數據時,稱為不可重復讀錯誤。不可重復讀錯誤產生的原因是其它事務在此期間更改了第二個事務正在讀取的數據。(如表三所示)

3.三類并發控制方法
在多用戶環境下,多個用戶可能同時對數據庫進行操作。假設在某一時間段內有多個事務同時在進行,且它們(或其中的一部分)操作了相同的數據,若沒有采用任何并發控制手段,就可能出現前文所說的數據錯誤。要避免這樣的錯誤,就必須采用并發控制方法。下面具體介紹三類并發控制方法。
3.1封鎖并發控制方法
封鎖是實現并發控制的一個非常重要的技術。所謂封鎖就是事務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做任何修改。
在運用X鎖和S鎖這兩種基本封鎖對數據對象加鎖時,還需要約定一些規則,如何時申請X鎖或S鎖,持鎖時間和何時釋放等。這些規則構成封鎖協議(Locking Protocol)。對應前面分析的并發操作問題,可以用以下三級協議解決:一級封鎖協議:事務T在修改數據R之前必須先對其加X鎖,直到事務結束才釋放。一級封鎖協議可以解決“丟失修改”的問題。二級封鎖協議:采用一級封鎖協議后,若事件T在讀取同一數據必須先對其加S鎖,讀完后即可釋放S鎖。二級封鎖協議可以解決“讀臟數據”的問題。三級封鎖協議:采用一級封鎖協議加上事務T在讀取數據R之前必須先對其加S鎖。直到事務結束才釋放。三級封鎖協議可以解決“不可重復讀”的問題。
兩段封鎖協議(Two-phase Locking)也是一種最常用的封鎖協議,理論上已經證明使用兩段封鎖協議產生的是可串行化調度。其主要內容是:
(1)在對任何數據進行讀寫之前,事務首先要獲得對該數據的封鎖。
(2)在釋放一個封鎖之后,事務不再獲得任何其它封鎖。
即事務分為兩個階段:
(1)生長階段:獲得封鎖。
(2)收縮階段:釋放封鎖。
兩段封鎖法的策略有兩個主要的優點:
(1)一個事務總是讀由另一個已提交的事務寫入的值,因此不會因為一個事務的計算是基于它本不應該看到的文件而中止它。
(2)所有鎖的請求與釋放都可以由系統來處理而無須事務關心:只要訪問一個文件就可以請求一個鎖,當事務結束時就可以釋放一個鎖。
3.2時間印并發控制方法
所謂時間印法就是在每個事務啟動運行時,并發控制機制賦予其惟一一個時間印(通常為事務的啟動時間),以實現多事務的可串行性。后繼事務有較大的時間印,事務的時間印一直保持到事務結束。
此外,每個數據實體都有時間印,分為讀時間印和寫時間印。讀時間印即數據上一次被讀出的時間,寫時間印即數據最近被寫入的時間。只有當時間印比數據項上的時間印大或者相當的事務才能執行對數據的操作,并在操作完成后置數據項的時間印為事務和數據項時間印的最大值,否則拒絕令操作重啟。這種方法使事務的并行等價于特定的串行序列,即按時間印遞增的序列,一般不會產生死鎖。
采用時間印的并行控制算法主要有兩種:基本時間印法和保守時間印法。在基本時間印法中,一旦發現沖突,不是等待而是重啟事務,因而不會發生死鎖,這是它的最大優點。但這一優點是以重啟事務為代價的,為避免事務重啟次數過多,又提出了保守時間印法和樂觀的并發控制法等改進方法。
保守時間印法的基本思想是不拒絕任何操作,因而不必重啟事務,如果操作不能執行則緩沖較年輕事務的操作直到所有較老的操作執行為止。此時,系統需要知道什么時候不再有較老的操作存在,而且緩沖事務的操作可能會造成較老事務等待較年輕事務的情況而造成死鎖,實現起來比較困難。
同封鎖法相比,時間印法有著不同的特性:
(1)當一個事務碰到了更大(晚)的時間印時,就要中止。
(2)封鎖法在相同的情況下要么等待,要么立即執行。
(3)另一方面,時間印法不會出現死鎖,這是極大的改進。
3.3樂觀并發控制法
樂觀的并發控制法是基于事務間的沖突操作很少,因此事務的執行可以不考慮沖突。但為解決沖突寫操作,需將其暫時保存,待事務結束后由專門的機構檢測是否可以將數據寫到數據庫中,若不能則重啟該事務。
樂觀并發控制法的思想驚人的簡單:盡管放心去做你想做的,不用在意其他人正在做什么。如果有問題出現,那么以后再考慮吧。在實際情況中,沖突相對來說非常少,所以這個策略大部分時間都可以正常工作。
樂觀并發控制算法最適合于基于私有工作空間的情況,每個事務都獨立地修改各自的文件,不會涉及其他的事務。在結束的時候,新的文件要么被提交要么被釋放。
樂觀并發控制算法的最大優點在于:避免了死鎖,而且允許最大的并行度(進程不需要去等待一個鎖)。它的缺點是有時可能會失效,這時所有事務都必須退回重新運行;在重負載的情況下,算法失效的可能性將會直線上升,這使得樂觀并發控制算法成了一個很糟糕的選擇。
4. 總結
三類并發控制方法各有自己的優缺點,在不同的領域有自己的應用范圍。在很多時候,我們還可以綜合考慮兩種并發控制方法,將其中的兩類并發控制方法結合起來,組成一種新的并發控制方法,以適應需要。
參考文獻:
[1]王珊,李盛恩.數據庫基礎應用.北京:人民郵電出版社,2002.8.
[2]涂振宇,曾碹.數據庫并發訪問機制研究.江西教育學院學報,2006.6:23-24.