国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

數(shù)據(jù)庫(kù)的并發(fā)控制

2008-07-14 10:05馬宏強(qiáng)
電腦知識(shí)與技術(shù) 2008年18期

摘要:事務(wù)的并發(fā)執(zhí)行可以顯著提高系統(tǒng)的資源利用率,改善對(duì)事務(wù)的響應(yīng)時(shí)間,但當(dāng)多個(gè)事務(wù)對(duì)數(shù)據(jù)庫(kù)進(jìn)行并發(fā)操作時(shí),如不加任何控制,可能會(huì)引起數(shù)據(jù)庫(kù)的的數(shù)據(jù)不一致。本文講述了并發(fā)操作引起的異常及如何解決異常問(wèn)題。

關(guān)鍵詞:并發(fā)操作;可串行化;兩段鎖協(xié)議;死鎖

中圖分類號(hào):TP311文獻(xiàn)標(biāo)識(shí)碼:A文章編號(hào):1009-3044(2008)18-2pppp-0c

Database Concurrency Control

MA Hong-qiang

(Zhongwei in Ningxia and public security fire brigade,Zhongwei 750021,China)

Abstract:transactions interleaved concurrency can significantly improve the utilization rate of resources,improve the response time of the Panel, but a number of transactions for concurrent operation of the database, if without any control, may cause the database data inconsistencies. This paper described the concurrent operation caused by abnormal anomalies and how to resolve the problem.

Key words: interleaved concurrency;serializable;Two-Phase Locking;Deadlock

1 概述

數(shù)據(jù)庫(kù)的重要特征是可以為多個(gè)用戶提供數(shù)據(jù)共享。例如飛機(jī)定票數(shù)據(jù)庫(kù)系統(tǒng)、銀行數(shù)據(jù)庫(kù)系統(tǒng)等都是多用戶數(shù)據(jù)庫(kù)系統(tǒng)。在這樣的系統(tǒng)中,在同一時(shí)刻并行運(yùn)行的事務(wù)數(shù)據(jù)目可達(dá)數(shù)百個(gè)。數(shù)據(jù)庫(kù)管理系統(tǒng)允許共享的用戶數(shù)目是數(shù)據(jù)庫(kù)管理系統(tǒng)重要性能參數(shù)據(jù)之一。數(shù)據(jù)庫(kù)管理系統(tǒng)(以下簡(jiǎn)稱為DBMS)必須提供并發(fā)控制機(jī)制來(lái)協(xié)調(diào)并發(fā)用戶的并發(fā)操作以保證并發(fā)事務(wù)的隔離性,從而達(dá)到數(shù)據(jù)庫(kù)的一致性。

事務(wù)可以一個(gè)一個(gè)地串行執(zhí)行,即每個(gè)時(shí)刻只有一個(gè)事務(wù)運(yùn)行,其他事務(wù)必須等到這個(gè)事務(wù)結(jié)束以后方能運(yùn)行。事務(wù)在執(zhí)行過(guò)程中需要不同的資源,有時(shí)需要CPU,有時(shí)需要存取數(shù)據(jù),有時(shí)需要I/O,有時(shí)需要通信。如果事務(wù)串行執(zhí)行則許多系統(tǒng)資源將處于空閑狀態(tài)。因此,為了充分利用系統(tǒng)資源,發(fā)揮數(shù)據(jù)庫(kù)共享資源的特點(diǎn),應(yīng)該允許多個(gè)事務(wù)并行地執(zhí)行。

2 并發(fā)操作引起的數(shù)據(jù)不一致性問(wèn)題

事務(wù)是并發(fā)控制的基本單位,具有四個(gè)特性:原子性(Atomicity)、一致性(Consistency)、隔離性(Isotation)和持續(xù)性(Durability)。這四個(gè)特性也簡(jiǎn)稱為ACID特性。保證事務(wù)ACID特性是DBMS的重要任務(wù),而遭到破壞的原因之一是多個(gè)事務(wù)對(duì)數(shù)據(jù)庫(kù)的并發(fā)操作造成的。

下面以飛機(jī)訂票系統(tǒng)中的一個(gè)活動(dòng)序列為例,說(shuō)明并發(fā)操作帶來(lái)的數(shù)據(jù)不一致問(wèn)題。

①甲售票點(diǎn)(甲事務(wù))讀出的某航班的機(jī)票余額為A,設(shè)A=16;

②乙售票點(diǎn)(乙事務(wù))讀出的同一航班的機(jī)票余額為A,也為16;

③甲售票點(diǎn)賣出一張機(jī)票,修改余額為A=A-1,所以A為15,把A寫(xiě)回到數(shù)據(jù)庫(kù);

④乙售票點(diǎn)也賣出一張機(jī)票,修改余額為A=A-1,所以A為15,把A寫(xiě)回到數(shù)據(jù)庫(kù);

結(jié)果明明賣出兩機(jī)票,數(shù)據(jù)庫(kù)中機(jī)票余額只減少1。這種情況稱為數(shù)據(jù)庫(kù)的不一致性。這種不一致性是由并發(fā)操作引起的。在并發(fā)操作情況下,對(duì)甲、乙兩個(gè)事務(wù)的操作序列的調(diào)度是隨機(jī)的。若按上面的調(diào)度序列執(zhí)行,甲事務(wù)的修改就被丟失。這是由于第④步中乙事務(wù)修改A并寫(xiě)回后覆蓋了甲事務(wù)的修改。

2.1 不一致類型

仔細(xì)分析并發(fā)操作帶來(lái)的數(shù)據(jù)不一致性包括三類:丟失修改、不可重復(fù)讀和讀“臟”數(shù)據(jù)。

2.1.1 丟失修改

以下為T(mén)1和T2兩個(gè)事務(wù)的四個(gè)時(shí)刻的活動(dòng)序列:

①T1讀A=16。

②T2讀A=16。

③T1將A=A-1寫(xiě)回,A=15。

④T2將A=A-1寫(xiě)回,A=15。

兩個(gè)事務(wù)T1和T2讀入同一數(shù)據(jù)并修改,T2提交的結(jié)果破壞了T1提交的結(jié)果,導(dǎo)致T1的修改被丟失。

2.1.2 不可重復(fù)讀

以下為T(mén)1和T2兩個(gè)事務(wù)的三個(gè)時(shí)刻的活動(dòng)序列:

①T1讀A=50,B=100,計(jì)算A+B=150。

②T2讀B=100,計(jì)算B=B*2=200,并寫(xiě)回B=200。

③T1讀A=50,B=200,計(jì)算A+B=250。

不可重復(fù)讀是指事務(wù)T1讀取數(shù)據(jù)后,事務(wù)T2執(zhí)行更新操作,使T1無(wú)法再現(xiàn)前一次讀取結(jié)果。具體地講,事可重復(fù)讀包括三種情況:

(1)事務(wù)T1讀取某一數(shù)據(jù)后(B=100),事務(wù)T2對(duì)其做了修改(B=200),當(dāng)事務(wù)T1再次讀該數(shù)據(jù)時(shí),提到與前一次不同的值(B從100變成了200)。

(2)事務(wù)T1按一定條件從數(shù)據(jù)庫(kù)中讀取了某些數(shù)據(jù)記錄后,事務(wù)T2刪除了其中的部分記錄,當(dāng)T1再次按相同條件讀取數(shù)據(jù)時(shí),發(fā)現(xiàn)某些記錄神秘地消失了。

(3)事務(wù)T1按一定條件從數(shù)據(jù)庫(kù)中讀取某數(shù)據(jù)記錄后,事務(wù)T2插入了一些記錄,當(dāng)T1再次按相同條件讀取數(shù)據(jù)時(shí),發(fā)現(xiàn)多了一些記錄。

后兩種不重復(fù)讀有時(shí)也稱為幻影現(xiàn)象。

2.1.3 讀“臟”數(shù)據(jù)

以下為T(mén)1和T2兩個(gè)事務(wù)的三個(gè)時(shí)刻的活動(dòng)序列:

①T1讀C=100,計(jì)算C=C*2=200,寫(xiě)回C。

②T2讀C=200。

③ROLLBACK,C恢復(fù)為100。

讀“臟”數(shù)據(jù)是指事務(wù)T1修改某一數(shù)據(jù),并將其寫(xiě)回磁盤(pán),事務(wù)T2讀取同一數(shù)據(jù)后(C=200),T1由于某種原因撤銷,其修改作廢,這時(shí)T1已修改過(guò)的數(shù)據(jù)就恢復(fù)原值(C=100),T2讀到的數(shù)據(jù)就與數(shù)據(jù)庫(kù)中的數(shù)據(jù)不一致,則T2讀到的數(shù)據(jù)就為“臟”數(shù)據(jù),即為不正確的數(shù)據(jù)。

產(chǎn)生上述三類數(shù)據(jù)不一致性的主要原因是并發(fā)操作破壞了事務(wù)的隔離性,并發(fā)控制就是要用正確的方式調(diào)度并發(fā)操作,使一個(gè)用戶事務(wù)的執(zhí)行不受其他事務(wù)的干擾,從而避免造成數(shù)據(jù)的不一致性。并發(fā)控制的主要技術(shù)是封鎖(Locking)。

3 封鎖是實(shí)現(xiàn)并發(fā)控制的主要技術(shù)

封鎖是實(shí)現(xiàn)并發(fā)控制的一個(gè)非常重要的技術(shù)。所謂封鎖就是事務(wù)T在對(duì)某個(gè)數(shù)據(jù)對(duì)象(例如表、記錄等)操作之前,先向系統(tǒng)發(fā)出請(qǐng)求,對(duì)其加鎖。加鎖后事務(wù)T就對(duì)該數(shù)據(jù)對(duì)象有了一定的控制,在事務(wù)T釋放客觀存在的鎖之前,其他的事務(wù)不能更新此數(shù)據(jù)對(duì)象。

基本的封鎖類型有兩種:排它鎖(Exclusive Locks,簡(jiǎn)稱X鎖)和共享鎖(Share Locks,簡(jiǎn)稱為S鎖)。排它鎖又稱為寫(xiě)鎖。若事務(wù)T對(duì)數(shù)據(jù)對(duì)象A加上X鎖,則只允許T讀取和修改A,其他任何事務(wù)在T釋放A上的鎖之前是不能再讀取和修改A。共享鎖又稱為讀鎖。若事務(wù)T對(duì)數(shù)據(jù)對(duì)象A加上S鎖,則事務(wù)T可以讀A但不能修改A,其他事務(wù)只能對(duì)A加S鎖,而不能加X(jué)鎖,直到T釋放A上的S鎖。這就保證了其他事務(wù)可以讀A,但在T釋放A上的S鎖之前不能對(duì)A做任何修改。

在運(yùn)用X鎖和S鎖這兩種基本封鎖,對(duì)數(shù)據(jù)對(duì)象加鎖時(shí),還需要約定一些規(guī)則,例如何時(shí)申請(qǐng)X鎖或S鎖、持鎖時(shí)間、何時(shí)釋放鎖等,稱這些規(guī)則為封鎖協(xié)議(Locking Protocol)。對(duì)封鎖方式規(guī)定不同就形成了各種封鎖協(xié)議。

3.1 兩段鎖協(xié)議

計(jì)算機(jī)系統(tǒng)對(duì)并發(fā)事務(wù)中并發(fā)操作的調(diào)度是隨機(jī)的,而不同的調(diào)度可能會(huì)產(chǎn)生不同的結(jié)果,那么哪個(gè)結(jié)果是正確的呢?如果一個(gè)事務(wù)運(yùn)行過(guò)程中沒(méi)有其他事務(wù)同時(shí)運(yùn)行,也就是說(shuō)它沒(méi)有受到其他事務(wù)的干擾,那么就可以認(rèn)為該事務(wù)的運(yùn)行結(jié)果是正確的。因此將所有事務(wù)串行起來(lái)的調(diào)度策略一定是正確的調(diào)度策略。雖然以不同的順序串行執(zhí)行事務(wù)可能會(huì)產(chǎn)生不同的結(jié)果,但由于不會(huì)將數(shù)據(jù)庫(kù)置于不一致的狀態(tài),因此都是正確的。

為了保證并發(fā)操作的正確性,DBMS的并發(fā)控制機(jī)制必須提供一定的手段來(lái)保證調(diào)度是可串行化的。從理論上講,在某一事務(wù)執(zhí)行時(shí)禁止其他事務(wù)執(zhí)行的調(diào)度策略一定是可串行化的調(diào)度,這也是最簡(jiǎn)單的調(diào)度策略,但這種方法實(shí)際上是不可取的,這使提用戶不能充分共享數(shù)據(jù)庫(kù)資源。目前DBMS普遍采用兩段封鎖方法實(shí)現(xiàn)并發(fā)操作調(diào)度的可串行性,從而保證調(diào)度的正確性。

所謂兩段鎖協(xié)議是指所有事務(wù)必須分兩個(gè)階段對(duì)數(shù)據(jù)對(duì)象加鎖和解鎖。具體作法如下:

(1)在對(duì)任何數(shù)據(jù)對(duì)象進(jìn)行讀、寫(xiě)操作之前,首先要申請(qǐng)并獲得對(duì)該數(shù)據(jù)對(duì)象的封鎖;

(2)在釋放一個(gè)封鎖之后,事務(wù)不再申請(qǐng)和獲得任何其他封鎖。

所謂“兩段”鎖的含義是:事務(wù)分為兩階段,第一階段是獲得封鎖,也稱為擴(kuò)展階段。在這階段,事務(wù)可以申請(qǐng)獲得任何數(shù)據(jù)對(duì)象上的任何類型的鎖,但是不能釋放任何鎖。第二階段是釋放封鎖,也稱為收縮階段。在這階段,事務(wù)可以釋放任何數(shù)據(jù)對(duì)象上的任何類型的鎖,但是不能再申請(qǐng)任何鎖??梢宰C明,若并發(fā)執(zhí)行的所有事務(wù)均遵守兩段協(xié)議是可串行化調(diào)度的充分條件,而不是必要條件。也就是說(shuō)若并發(fā)事務(wù)都遵守兩段鎖協(xié)議,則對(duì)這些事務(wù)的任何并發(fā)調(diào)度都是可串行化的;若對(duì)并發(fā)事務(wù)的一個(gè)調(diào)度是可串行化的,但不一定所有事務(wù)都符合兩段鎖協(xié)議。

以下為T(mén)1和T2兩個(gè)事務(wù)的一種活動(dòng)序列:

①T1事務(wù)SLOCK B,讀B=2,賦值于Y(即Y=B=2),XLOCK A。

②T2事務(wù)SLOCK A,(由于A被加了X鎖,所以加鎖失?。┑却鼳上鎖的釋放。

③T1事務(wù)計(jì)算A=Y+1,寫(xiě)回A=3。

④T1事務(wù)UNLOCK B,此時(shí)T2事務(wù)仍在等待A上鎖的釋放;T1事務(wù)UNLOCK A,此時(shí)T2事務(wù)仍在等待A上鎖的釋放。

⑤T2事務(wù)SLOCK A(由于A上鎖已釋放,所以加鎖成功),讀A=3,Y=A,XLOCK B,B=Y+1,寫(xiě)回B=4,UNLOCK B,UNLOC A。

在這個(gè)活動(dòng)序列中,T1和T2都遵守兩段鎖協(xié)議,因此調(diào)度是可串行化的。

以下為T(mén)1和T2兩個(gè)事務(wù)的另一種活動(dòng)序列:

①T1事務(wù)SLOCK B,讀B=2,賦值于Y(即Y=B=2),UNLOCK B,XLOCK A。

②T2事務(wù)SLOCK A(由于A被加了X鎖,所以加鎖失?。?,等待A上鎖的釋放。

③T1事務(wù)計(jì)算A=Y+1,寫(xiě)回A=3,UNLOCK A;此時(shí)T2事務(wù)仍在等待A上鎖的釋放。

④T2事務(wù)SLOCK A(由于A上鎖已釋放,所以加鎖成功),讀A=3,X=A,UNLOC A ,XLOCK B,B=X+1,寫(xiě)回B=4,UNLOCK B。

在這個(gè)活動(dòng)序列中,T1和T2沒(méi)有遵守兩段鎖協(xié)議,但調(diào)度是可串行化的。以上的兩個(gè)例子可以說(shuō)明若并發(fā)執(zhí)行的所有事務(wù)均遵守兩段鎖協(xié)議是可串行化調(diào)度的充分條件,而不是必要條件。

4 死鎖問(wèn)題

4.1 死鎖現(xiàn)象

由于兩段鎖協(xié)議并不要求事務(wù)必須一次將所有要使用的數(shù)據(jù)對(duì)象全部加鎖,因此遵守兩段協(xié)議的事務(wù)可能發(fā)生死鎖。以下為T(mén)1和T2兩個(gè)事務(wù)的一種活動(dòng)序列:

①T1事務(wù)SLOCK B,讀B=2。

②T2事務(wù)SLOCK A,讀A=2。

③T1事務(wù)XLOCK A(由于A已被T2事務(wù)加上S鎖,所以加X(jué)鎖失?。却鼳上鎖的釋放。

④T2事務(wù)XLOCK B(由于B已被T1事務(wù)加上S鎖,所以加X(jué)鎖失?。?,等待B上鎖的釋放。

在這個(gè)活動(dòng)序列中,出現(xiàn)了T1在等待T2,而T2又在等待T1的局面,T1和T2兩個(gè)事務(wù)永遠(yuǎn)不能結(jié)束,形成死鎖現(xiàn)象。

死鎖現(xiàn)象在操作系統(tǒng)和一般并行處理中已有了成熟的解決方法。目前在數(shù)據(jù)庫(kù)中解決死鎖現(xiàn)象主要有兩類方法,一類是采取一定措施來(lái)預(yù)防死鎖的發(fā)生;另一類方法是允許發(fā)生死鎖,采用一定手段定期診斷系統(tǒng)中有無(wú)死鎖,若有則解除之。

4.2 死鎖的預(yù)防

在數(shù)據(jù)庫(kù)中,產(chǎn)生死鎖的原因是兩個(gè)或多個(gè)事務(wù)都已封鎖了一些數(shù)據(jù)對(duì)象,然后又都請(qǐng)請(qǐng)求對(duì)已被其他事務(wù)封鎖的數(shù)據(jù)對(duì)象進(jìn)行加鎖,從而出現(xiàn)相互死等待。防止死鎖的發(fā)生其實(shí)就是要破壞產(chǎn)生死鎖的條件。預(yù)防死鎖通常有兩種方法:

(1)一次封鎖方法

一次封鎖法要求每個(gè)事務(wù)必須一次將所有要使用的數(shù)據(jù)對(duì)象全部加鎖,否則就不能繼續(xù)執(zhí)行。一次封鎖雖然可以有效地防止死鎖的發(fā)生,但也存在問(wèn)題:第一,一次就將以后要用到的全部數(shù)據(jù)對(duì)象加鎖,勢(shì)必?cái)U(kuò)大了封鎖的范圍,從而降低了系統(tǒng)的并發(fā)度;第二,數(shù)據(jù)庫(kù)中數(shù)據(jù)是來(lái)斷變化的,原來(lái)不要求封鎖的數(shù)據(jù),在執(zhí)行過(guò)程中可能會(huì)變成封鎖對(duì)象,所以很難事先精確地確定每個(gè)事務(wù)所要封鎖的數(shù)據(jù)對(duì)象。

(2)順序封鎖法

順序封鎖法是預(yù)先對(duì)數(shù)據(jù)對(duì)象規(guī)定一個(gè)封鎖順序,所有事務(wù)都按這個(gè)順序?qū)嵭蟹怄i。順序封鎖法可以有效地防止死鎖,但也同樣存在問(wèn)題:第一,數(shù)據(jù)庫(kù)系統(tǒng)中封鎖的數(shù)據(jù)對(duì)象極多,并且隨著數(shù)據(jù)的插入、刪除等操作不斷地變化,要維護(hù)這樣的資源的封鎖順序非常困難,成本太高;第二,事務(wù)的封鎖請(qǐng)示可以隨著事務(wù)的執(zhí)行而動(dòng)態(tài)地決定,很難事先確定每一個(gè)事務(wù)要封鎖哪些數(shù)據(jù)對(duì)象,因此也就很難按規(guī)定的順序去施加封鎖。

可見(jiàn),在操作系統(tǒng)中廣為采用的預(yù)防死鎖的策略并不很適合數(shù)據(jù)庫(kù)的特點(diǎn),因此DBMS在解決死鎖現(xiàn)象普遍采用的是診斷并解除死鎖的方法。

4.3 死鎖的診斷與解除

數(shù)據(jù)庫(kù)系統(tǒng)中診斷死鎖的方法與操作系統(tǒng)類似,一般使用超時(shí)法或事務(wù)等待圖法。

(1)超時(shí)法

如果一個(gè)事務(wù)的等待時(shí)間超過(guò)了規(guī)定的時(shí)限,就認(rèn)為發(fā)生了死鎖。超時(shí)法實(shí)現(xiàn)簡(jiǎn)單,但其不足也很明顯。一是有可能誤判死鎖,事務(wù)因?yàn)槠渌蚴沟却龝r(shí)間超過(guò)時(shí)限,系統(tǒng)會(huì)誤以為發(fā)生了死鎖。二是時(shí)限若設(shè)置得太長(zhǎng),死鎖發(fā)生后不能及時(shí)發(fā)現(xiàn)。

(2)等待圖法

事務(wù)等待圖是一個(gè)有向圖G(T,U)。T為結(jié)點(diǎn)的集合,每個(gè)結(jié)點(diǎn)表示正在運(yùn)行的事務(wù);U為邊的集合,每條邊表示事務(wù)等待的情況。若T1等待T2,則T1,T2之間邊一條有向邊,從T1指向T2。事務(wù)等待圖動(dòng)態(tài)地反映了所有事務(wù)的等待情況。并發(fā)控制系統(tǒng)周期性地(例如每隔1分鐘)檢測(cè)事務(wù)等待圖,如果發(fā)現(xiàn)圖中存在回路,則表示系統(tǒng)中出現(xiàn)了死鎖。

系統(tǒng)一但檢測(cè)出存在死鎖,就要設(shè)法解除。通常采用的方法是選擇一個(gè)處理死鎖代價(jià)最小的事務(wù),將其撤銷,釋放此事務(wù)持有的所有的鎖,使其他事務(wù)得以繼續(xù)運(yùn)行下去。當(dāng)然對(duì)于撤消的事務(wù)所執(zhí)行的數(shù)據(jù)修改操作必須加以恢復(fù)。

參考文獻(xiàn):

[1]Abraham Silberschatz(美),著.楊冬青,譯.數(shù)據(jù)庫(kù)系統(tǒng)概念,機(jī)械工業(yè)出版社,2002.2.

[2]莊成三.數(shù)據(jù)庫(kù)系統(tǒng)原理及其應(yīng)用,電子工業(yè)出版社,2000.6.

[3]俞盤(pán)祥.數(shù)據(jù)庫(kù)系統(tǒng)原理.清華大學(xué)出版社,1988.

收稿日期:2008-03-18

作者簡(jiǎn)介:馬宏強(qiáng)(1980-),男,寧夏固原人,助理工程師,學(xué)士,主要研究領(lǐng)域:計(jì)算機(jī)開(kāi)發(fā)與應(yīng)用。