前言
數(shù)據(jù)庫技術(shù)是計算機科學(xué)技術(shù)中發(fā)展最快,應(yīng)用最廣的技術(shù)之一,它是專門研究如何科學(xué)的組織和存儲數(shù)據(jù),如何高效地獲取和處理數(shù)據(jù)的技術(shù)。它已成為各行各業(yè)存儲數(shù)據(jù)、管理信息、共享資源和決策支持的最先進,最常用的技術(shù)。
當(dāng)前互聯(lián)網(wǎng)+與大數(shù)據(jù),一切都建立在數(shù)據(jù)庫之上,以數(shù)據(jù)說話,首先需要聚集數(shù)據(jù)、分析數(shù)據(jù)和管理數(shù)據(jù),數(shù)據(jù)庫技術(shù)已成為各種計算機系統(tǒng)的核心技術(shù)。數(shù)據(jù)庫相關(guān)知識也已成為每個人必須掌握的知識。
一、并發(fā)控制概述
允許多個用戶同時使用的數(shù)據(jù)庫系統(tǒng)稱為多用戶數(shù)據(jù)庫系統(tǒng)。例如飛機訂票數(shù)據(jù)庫系統(tǒng)、銀行數(shù)據(jù)庫系統(tǒng)等都是多用戶數(shù)據(jù)庫系統(tǒng)。在這樣的系統(tǒng)中,在同一時刻并發(fā)運行的事務(wù)數(shù)可達數(shù)百個。
事務(wù)可以一個一個地串行執(zhí)行,即每個時刻只有一個事務(wù)運行,其他事務(wù)必須等到這個事務(wù)結(jié)束以后方能運行。事務(wù)在執(zhí)行過程中需要不同的資源,有時需要CPU,有時需要存取數(shù)據(jù)庫,有時需要I/O,有時需要通信。如果事務(wù)串行執(zhí)行,則許多系統(tǒng)資源將處于空閑狀態(tài)。因此,為了充分利用系統(tǒng)資源發(fā)揮數(shù)據(jù)庫共享資源的特點,應(yīng)該允許多個事務(wù)并行地執(zhí)行
如下:設(shè)T1,T2,T3是如下三個事務(wù),其中R為數(shù)據(jù)庫中某個數(shù)據(jù)項,設(shè)R的初值為0。
T1:R:= R+5
T2:R:= R*3
T3:R:= 2
若允許三個事務(wù)并行執(zhí)行,我們可以列出所有可能的正確結(jié)果。
(1)T1-T2-T3: R=2
(2)T1-T3-T2: R=6
(3)T2-T1-T3: R=2
(4)T2-T3-T1: R=7
(5)T3-T1-T2: R=21
(6)T3-T2-T1: R=11
二、數(shù)據(jù)庫的不一致問題
事務(wù)并發(fā)執(zhí)行帶來的問題:會產(chǎn)生多個事務(wù)同時存取同一數(shù)據(jù)的情況;可能會存取和存儲不正確的數(shù)據(jù),破壞事務(wù)一致性和數(shù)據(jù)庫的一致性
舉個例子,說明并發(fā)操作帶來的數(shù)據(jù)不一致問題:
在飛機訂票系統(tǒng)中的一個活動序列
1.甲售票點(T1)讀出某航班的機票余額A,設(shè)A=100;
2.乙售票點(T2)讀出同一航班的機票余額A,也為100;
3.甲售票點賣出十張機票,修改余額A←A-10,所以A為90,把A寫回數(shù)據(jù)庫;
4.乙售票點也賣出十張機票,修改余額A←A-10,所以A為90,把A寫回數(shù)據(jù)庫。
結(jié)果賣出二十張機票,數(shù)據(jù)庫中機票余額只減少10。造成這種情況的原因是第4步中乙事務(wù)修改A并寫回后覆蓋了甲事務(wù)的修改。
我們把這種情況稱為數(shù)據(jù)這種情況稱為數(shù)據(jù)庫的不一致性,是由并發(fā)操作引起的。在并發(fā)操作情況下,對甲、乙兩個事務(wù)的操作序列的調(diào)度是隨機的。若按上面的調(diào)度序列執(zhí)行,甲事務(wù)的修改就被丟失。
當(dāng)并發(fā)事物以不受控制的方式進行執(zhí)行時,可能會出現(xiàn)一些問題。并發(fā)操作帶來的數(shù)據(jù)不一致性包括三類:丟失更新問題(Lost Update),不可重復(fù)讀問題(Non-repeatable Read)和讀“臟”數(shù)據(jù)問題(Dirty Read)。
2.1 丟失更新問題
當(dāng)兩個事物訪問相同的數(shù)據(jù)庫項時就會出現(xiàn)丟失更新的問題,使得某些數(shù)據(jù)庫項的值會不正確。換句話說,如果事務(wù)T1和事務(wù)T2都是先讀一條記錄,然后進行修改,那么第一個更新的影響將被第二個更新所覆蓋。上面的飛機訂票的例子就屬此類
事務(wù)T1 | 事務(wù)T2 | |
---|---|---|
1 | 讀A=100 | |
2 | A=100 | |
3 | A=A-10,寫回A=90 | |
4 | A=A-10,寫回A=90 |
從這個表中可以觀察到,當(dāng)?shù)诙€事務(wù)T2開始讀取A的值時,第一個事務(wù)T1還沒有提交。因此,事務(wù)T2仍然是在A=100這個值上進行操作,得到結(jié)果A=90。同時,事務(wù)T1將A=90這個值寫回到磁盤存儲中,這樣它就立即被事務(wù)T2重寫了。因此,在整個過程中丟失了賣出10張票
2.2 不可重復(fù)讀問題
當(dāng)某個事務(wù)在一些數(shù)據(jù)集上計算一些匯總(集合)函數(shù),而其他的事務(wù)正在修改這些數(shù)據(jù)時就會出現(xiàn)不可重復(fù)讀(或者更新不一致的檢索)問題。這個問題是事務(wù)可能在一些數(shù)據(jù)被更改之前讀取而另一些數(shù)據(jù)是在被更改之后讀取,因此產(chǎn)生了不一致的結(jié)果。在不可重復(fù)讀中,事務(wù)T1讀取一個記錄,然后在事務(wù)T2更改這個記錄時進行一些其他的處理?,F(xiàn)在,如果事物T1重新讀取這個記錄,則新的值將和之前的值不一致。
不可重復(fù)讀包括三種情況:
(1)事務(wù)T1讀取某一數(shù)據(jù)后,事務(wù)T2對其做了修改,當(dāng)事務(wù)T1再次讀該數(shù)據(jù)時,得到與前一次不同的值。
(2)事務(wù)T1按一定條件從數(shù)據(jù)庫中讀取了某些數(shù)據(jù)記錄后,事務(wù)T2刪除了其中部分記錄,當(dāng)T1再次按相同條件讀取數(shù)據(jù)時,發(fā)現(xiàn)某些記錄消失了。
(3)事務(wù)T1按一定條件從數(shù)據(jù)庫中讀取某些數(shù)據(jù)記錄后,事務(wù)T2插入了一些記錄,當(dāng)T1再次按相同條件讀取數(shù)據(jù)時,發(fā)現(xiàn)多了一些記錄。
后兩種不可重復(fù)讀有時也稱為幻影現(xiàn)象(Phantom Row)
事務(wù)T1 | 事務(wù)T2 | |
---|---|---|
1 | 讀A=100,B=200,求和A+B=300 | |
2 | 讀B=200,B=B*2,B=400 | |
3 | 讀A=100,B=400,求和A+B=500(驗算結(jié)果不對) |
2.3 讀“臟”數(shù)據(jù)問題
當(dāng)一個事務(wù)修改數(shù)據(jù),卻由于某些原因使得事務(wù)失敗了,而被修改的數(shù)據(jù)庫項在被修改回原來的原始值之前又被其他的事務(wù)訪問了,這是就會出現(xiàn)讀“臟”數(shù)據(jù)的問題。
也就是說,事務(wù)T1修改某一數(shù)據(jù),并將其寫回磁盤,事務(wù)T2讀取同一數(shù)據(jù)后,T1由于某種原因被撤銷,這時T1已修改過的數(shù)據(jù)恢復(fù)原值,T2讀到的數(shù)據(jù)就與數(shù)據(jù)庫中的數(shù)據(jù)不一致,T2讀到的數(shù)據(jù)就為“臟”數(shù)據(jù),即不正確的數(shù)據(jù)。
事務(wù)T1 | 事務(wù)T2 | |
---|---|---|
1 | 讀A=100,A=A*2,A=200 | |
2 | 讀A=200 | |
3 | ROLLBACK,A恢復(fù)為100 |
三、封鎖
封鎖是并發(fā)控制中的加鎖方法,是實現(xiàn)并發(fā)控制的一個非常重要的技術(shù)。
鎖是與數(shù)據(jù)項有關(guān)的一個變量,它描述了數(shù)據(jù)項的狀態(tài),這個狀態(tài)反映了在數(shù)據(jù)項上可進行的操作。它防止第二個事務(wù)在第一個事務(wù)完成它全部活動之前,對數(shù)據(jù)庫記錄進行訪問。
打個比方,事務(wù)T在對某個數(shù)據(jù)對象例如表、記錄等操作之前,先向系統(tǒng)發(fā)出請求,對其加鎖。加鎖后事務(wù)T就對該數(shù)據(jù)對象有了一定的控制,在事務(wù)T釋放它的鎖之前,其他的事務(wù)不能更新此數(shù)據(jù)對象。
通常,在數(shù)據(jù)庫中每個數(shù)據(jù)項都有一個鎖。鎖作為同步化并發(fā)事務(wù)對數(shù)據(jù)庫訪問的一種手段而被廣泛使用。因此,封鎖模式用于允許并發(fā)執(zhí)行兼容的操作。換句話說,可交換的活動是兼容的。封鎖是并發(fā)控制最常使用的形式,而且它也是大多數(shù)應(yīng)用程序所選擇的方法。
基本的封鎖類型有兩種: 排他鎖(Exclusive Locks,簡稱X鎖,也稱寫鎖) 和共享鎖(Share Locks,簡稱S鎖,也稱讀鎖)。
3.1 排他鎖
排他鎖又稱為寫鎖。若事務(wù)T對數(shù)據(jù)對象A加上X鎖,則只允許T讀取和修改A,其他任何事務(wù)都不能再對A加任何類型的鎖,直到T釋放A上的鎖。這就保證了其他事務(wù)在T釋放A上的鎖之前不能再讀取和修改A。
3.2 共享鎖
共享鎖又稱為讀鎖。若事務(wù)T對數(shù)據(jù)對象A加上S鎖,則事務(wù)T可以讀A但不能修改A,其他事務(wù)只能再對A加S鎖,而不能加X鎖,直到T釋放A上的S鎖。這就保證了其他事務(wù)可以讀A,但在T釋放A上的S鎖之前不能對A做任何修改。
T1\T2 | X | S | 無鎖 |
---|---|---|---|
X | N | N | Y |
S | N | Y | Y |
無鎖 | Y | Y | Y |
如表所示,最左邊一列表示事務(wù)T1已經(jīng)獲得的數(shù)據(jù)對象上的鎖的類型。最上面一行表示另一事務(wù)T2對同一數(shù)據(jù)對象發(fā)出的封鎖請求。T2的封鎖請求能否被滿足用矩陣中的Y和N表示,Y表示事務(wù)T2的封鎖要求與T1已持有的鎖相容,封鎖請求可以滿足,N表示T2的封鎖請求與T1已持有的鎖沖突,T2的請求被拒絕。
四、封鎖協(xié)議
在運用X鎖和S鎖這兩種基本鎖對數(shù)據(jù)對象加鎖時,還需要約定一些規(guī)則,例如何時申請X鎖或S鎖、持鎖時間、何時釋放等。這些規(guī)則被稱為封鎖協(xié)議(Locking Protocol)。對封鎖方式規(guī)定不同的規(guī)則,就形成了各種不同的封鎖協(xié)議。下面介紹三級封鎖協(xié)議。
4.1 一級封鎖協(xié)議
一級封鎖協(xié)議是:事務(wù)T在修改數(shù)據(jù)R之前必須先對其加X鎖,直到事務(wù)結(jié)束才釋放。事務(wù)結(jié)束包括正常結(jié)束(COMMIT)和非正常結(jié)束(ROLLBACK)。
一級封鎖協(xié)議可防止丟失修改,并保證事務(wù)T是可恢復(fù)的,在一級封鎖協(xié)議中,如果僅僅是讀數(shù)據(jù)不對其進行修改,是不需要加鎖的,所以它不能保證可重復(fù)讀和不讀“臟”數(shù)據(jù)。
4.2 二級封鎖協(xié)議
二級封鎖協(xié)議是:在一級封鎖協(xié)議基礎(chǔ)上,事務(wù)T在讀取數(shù)據(jù)R之前必須先對其加S鎖,讀完后即可釋放S鎖。
二級封鎖協(xié)議除防止了丟失修改,還可進一步防止讀“臟”數(shù)據(jù)。在二級封鎖協(xié)議中,由于讀完數(shù)據(jù)后即可釋放S鎖,所以它不能保證可重復(fù)讀。
4.3 三級封鎖協(xié)議
三級封鎖協(xié)議是:在一級封鎖協(xié)議基礎(chǔ)上,事務(wù)T在讀取數(shù)據(jù)R之前必須先對其加S鎖,直到事務(wù)結(jié)束才釋放。
三級封鎖協(xié)議除防止了丟失修改和讀“臟”數(shù)據(jù)外,還進一步防止了不可重復(fù)讀。
上述三級協(xié)議的主要區(qū)別在于什么操作需要申請封鎖,以及何時釋放鎖(即持鎖時間)。
五、活鎖和死鎖
和操作系統(tǒng)一樣,封鎖的方法可能引起活鎖和死鎖。死鎖(DeadLock)和活鎖(LiveLock)是并發(fā)應(yīng)用程序經(jīng)常發(fā)生的問題,也是多線程編程中的重要概念。以下是對死鎖和活鎖的形象描述。
現(xiàn)有一條路,兩個人寬,從兩個相對的方向迎面走來兩個人A和B。
死鎖的情況: A和B兩個人都不愿意給對方讓路,所以A和B都在等對方先讓路,導(dǎo)致誰也過不去。
活鎖的情況:A和B兩個人都主動給別人讓路。A往左移,同時B往右移;A往右移,同時B往左移。 A和B在移動的時候,同時擋住對方,導(dǎo)致誰也過不去。
5.1 活鎖
如果事務(wù)T1封鎖了數(shù)據(jù)R,事務(wù)T2又請求封鎖R,于是T2等待。T3也請求封鎖R,當(dāng)T1釋放了R上的封鎖之后系統(tǒng)首先批準(zhǔn)了T3的請求,T2仍然等待。然后T4又請求封鎖R,當(dāng)T3釋放了R上的封鎖之后系統(tǒng)又批準(zhǔn)了T4的請求……,T2有可能永遠等待,這就是活鎖(LiveLock)的情形。
T1 | T2 | T3 | T4 |
---|---|---|---|
Lock R | … | … | … |
… | Lock R | … | … |
… | 等待 | Lock R | … |
… | 等待 | 等待 | Lock R |
Unlock | 等待 | Lock R | 等待 |
… | 等待 | … | 等待 |
… | 等待 | Unlock | 等待 |
… | 等待 | … | Lock R |
… | 等待 | … | … |
避免活鎖的簡單方法是采用先來先服務(wù)的策略。當(dāng)多個事務(wù)請求封鎖同一數(shù)據(jù)對象時,封鎖子系統(tǒng)按請求封鎖的先后次序?qū)κ聞?wù)排隊,數(shù)據(jù)對象上的鎖一旦釋放就批準(zhǔn)申請隊列中第一個事務(wù)獲得鎖。
5.2 死鎖
死鎖(DeadLock)是集合中的兩個(或多個)事務(wù)同時等待集合中的其他事務(wù)釋放鎖的情況。所有的事務(wù)都不能繼續(xù)執(zhí)行了,因為集合中的每個事務(wù)都在一個等待隊列中,等待集合中的一個其他事物釋放數(shù)據(jù)項上的鎖。
T1 | T2 |
---|---|
Lock R1 | … |
… | Lock R2 |
… | … |
Lock R2 | … |
等待 | … |
等待 | Lock R1 |
等待 | … |
… | … |
… | … |
如果事務(wù)T1封鎖了數(shù)據(jù)R1,T2封鎖了數(shù)據(jù)R2,然后T1又請求封鎖R2,因T2已封鎖了R2,于是T1等待T2釋放R2上的鎖。接著T2又申請封鎖R1,因T1已封鎖了R1,T2也只能等待T1釋放R1上的鎖。這樣就出現(xiàn)了T1在等待T2,而T2又在等待T1的局面,T1和T2兩個事務(wù)永遠不能結(jié)束,形成死鎖。死鎖也成為循環(huán)等待情形,這里兩個事物互相等待(直接或間接)資源。因此在死鎖中,兩個事物互相排斥訪問下一個所需的記錄來完成它們的事務(wù),也稱為死亡擁抱(Deadly Embrace)。
5.3 死鎖的檢測和預(yù)防
死鎖檢測是由DBMS實現(xiàn)的一個定期檢測,以確定是否由于某些原因使得事務(wù)的等待時間超過了預(yù)定限制的情況。死鎖出現(xiàn)的頻率主要與查詢負荷以及數(shù)據(jù)庫的物理組織有關(guān)。為了計算死鎖的發(fā)生頻率,Gray在1981年提出了每秒產(chǎn)生的死鎖是多個程序的個數(shù)的平方和事務(wù)大小的四次方的論斷。檢測和預(yù)防死鎖的基本模式有如下三種:
(1)從不允許死鎖發(fā)生(死鎖預(yù)防)
(2)當(dāng)某事物被阻塞時檢測死鎖(死鎖檢測)
(3)定期地檢查死鎖(死鎖避免)
六、并發(fā)調(diào)度的可串行性
多個事務(wù)的并發(fā)執(zhí)行是正確的,當(dāng)且僅當(dāng)其結(jié)果與按某一次序串行地執(zhí)行它們時的結(jié)果相同,我們稱這種調(diào)度策略為可串行化(Serializable)的調(diào)度。
可串行性(Serializability): 是并發(fā)事務(wù)正確性的準(zhǔn)則。按這個準(zhǔn)則規(guī)定,一個給定的并發(fā)調(diào)度,當(dāng)且僅當(dāng)它是可串行化的,才認為是正確調(diào)度。
現(xiàn)在有兩個事務(wù),A和B的初始值均為2:
事務(wù)T1:讀B;A=B+1;寫回A
事務(wù)T2:讀A;B=A+1;寫回B
分別按照T1至T2和T2至T1給出這兩個事務(wù)不同的調(diào)度策略
串行調(diào)度A
T1 | T2 |
---|---|
Slock B | |
Y=R(B)=2 | |
Unlock B | |
Xlock A | |
A=Y+1=3 | |
W(A) | |
Unlock A | |
Slock A | |
X=R(A)=3 | |
Unlock A | |
Xlock B | |
BX+1=4 | |
W(B) | |
Unlock B |
串行調(diào)度B
T1 | T2 |
---|---|
Slock A | |
X=R(A)=2 | |
Unlock A | |
Xlock B | |
BX+1=3 | |
W(B) | |
Unlock B | |
Slock B | |
Y=R(B)=3 | |
Unlock B | |
Xlock A | |
A=Y+1=4 | |
W(A) | |
Unlock A |
不可串行化的調(diào)度C
T1 | T2 |
---|---|
Slock B | |
Y=R(B)=2 | |
Slock A | |
X=R(A)=2 | |
Unlock B | |
Unlock A | |
Xlock A | |
A=Y+1=3 | |
W(A) | |
Xlock B | |
B=X+1=3 | |
W(B) | |
Unlock A | |
Unlock B |
可串行化的調(diào)度D
T1 | T2 |
---|---|
Slock B | |
Y=R(B)=2 | |
Unlock B | |
Xlock A | |
Slock A | |
A=Y+1=3 | 等待 |
W(A) | 等待 |
Unlock A | 等待 |
X=R(A)=3 | |
Unlock A | |
Xlock B | |
B=X+1=4 | |
W(B) | |
Unlock B |
為了保證并發(fā)操作的正確性,DBMS的并發(fā)控制機制必須提供一定的手段來保證調(diào)度是可串行化的。
從理論上講,在某一事務(wù)執(zhí)行時禁止其他事務(wù)執(zhí)行的調(diào)度策略一定是可串行化的調(diào)度,這也是最簡單的調(diào)度策略。但這種方法實際上是不可取的,因為它使得用戶不能充分共享數(shù)據(jù)庫資源。目前DBMS普遍采用封鎖方法實現(xiàn)并發(fā)操作調(diào)度的可串行性,從而保證調(diào)度的正確性。
兩段鎖(Two-Phase Locking,簡稱2PL)協(xié)議就是保證并發(fā)調(diào)度可串行性的封鎖協(xié)議。除此之外還有其他一些方法,如時間方法、樂觀方法等來保證調(diào)度的正確性。
七、兩段鎖協(xié)議
兩段鎖協(xié)議(Two-Phase Locking,簡稱2PL) 是控制并發(fā)處理的一個方法或一個協(xié)議。在兩段鎖中,所有的封鎖操作都在第一個解鎖操作之前。因此,如果事務(wù)中的所有加鎖操作(比如read_lock、write_lock)都在第一個解鎖操作之前,則稱此事務(wù)是遵循兩段鎖協(xié)議的。
所謂兩段鎖協(xié)議是指所有事務(wù)必須分兩個階段對數(shù)據(jù)項加鎖和解鎖。在對任何數(shù)據(jù)進行讀、寫操作之前,首先要申請并獲得對該數(shù)據(jù)的封鎖;在釋放一個封鎖之后,事務(wù)不再申請和獲得任何其他封鎖。
事務(wù)分為兩個階段,第一階段是獲得封鎖,也稱為增長階段,在這個階段事務(wù)獲得所有需要的鎖而不釋放任何數(shù)據(jù)上的鎖。一旦獲得了所有的鎖,事務(wù)就處在它的鎖定點。第二階段是釋放封鎖,也稱為收縮階段,在這個階段事務(wù)釋放全部的鎖,并且不能再獲得任何新鎖。
上述兩階段鎖有下述規(guī)則保證:
(1)兩個事務(wù)不能有沖突的鎖。
(2)在同一個事務(wù)中,任何解鎖操作都不能在加鎖操作之前。
(3)在獲得所有的鎖之前不影響任何數(shù)據(jù),即在事務(wù)處于它的鎖定點時才能影響數(shù)據(jù)
事務(wù)T1遵守兩段鎖協(xié)議,其封鎖序列是 :
Slock A Slock B Xlock C Unlock B Unlock A Unlock C;
事務(wù)T2不遵守兩段鎖協(xié)議,其封鎖序列是:
Slock A Unlock A Slock B Xlock C Unlock C Unlock B;
八、鎖的粒度
數(shù)據(jù)庫基本上是作為命名的數(shù)據(jù)項的集合,由并發(fā)控制程序選擇的作為保護單位的數(shù)據(jù)項的大小稱為粒度(Granularity)。
封鎖對象可以是邏輯單元,也可以是物理單元。
粒度是由并發(fā)控制子系統(tǒng)控制的獨立的數(shù)據(jù)單位,在基于鎖的并發(fā)控制機制中,粒度是一個可加鎖單位。鎖的粒度表明加鎖使用的級別。在最通常的情況下,鎖的粒度是數(shù)據(jù)頁。大多數(shù)商業(yè)數(shù)據(jù)庫系統(tǒng)都提供了不同的加鎖粒度。加鎖可以發(fā)生在下述級別上:
- 數(shù)據(jù)庫級
- 表級 頁級
- 行(元組)級
- 屬性(字段)級
8.1 數(shù)據(jù)庫級鎖
在數(shù)據(jù)庫級鎖上,整個數(shù)據(jù)庫被加鎖。因此,在事務(wù)T1執(zhí)行期間拒絕事務(wù)T2使用數(shù)據(jù)庫中的任何表。
8.2 表級鎖
在表級鎖上,對整個表進行加鎖。因此,在事務(wù)T1使用這個表時拒絕事務(wù)T2訪問表中的任何行(元組)。如果某個事務(wù)希望訪問一些表,則每個表都被加鎖。但兩個事物可以訪問相同的數(shù)據(jù)庫,只要它們訪問的表不同即可。
表級鎖的限制比數(shù)據(jù)庫級鎖少,但當(dāng)有很多事務(wù)等待訪問相同的表時會引起阻塞,尤其是當(dāng)事務(wù)需要訪問相同表的不同部分而且彼此沒有相互干擾時,這個條件就成為一個問題。表級鎖不適合多用戶DBMS。
8.3 頁級鎖
在頁級鎖上,整個磁盤頁(或磁盤塊)被加鎖。一個表能夠跨多個頁,而一個頁也可以包含一個或者多個表的若干行(元組)。
頁級鎖最適合多用戶DBMS。
8.4行級鎖
在行級鎖上,對特定的行(或元組)進行加鎖,對數(shù)據(jù)庫中的每個表的每一行進行加鎖。DBMS允許并發(fā)事務(wù)訪問同一個表的不同行,即使這些行位于相同的頁上。
行級鎖比數(shù)據(jù)庫級鎖、表級鎖或頁級鎖的限制要少很多,行級鎖提高了數(shù)據(jù)的可獲得性,但是對于行級鎖的管理需要很高的成本。
8.5 屬性(或字段)級鎖
在屬性級鎖上,對特定的屬性(或字段)進行加鎖。屬性級鎖允許并發(fā)事務(wù)訪問相同的行,只要這些事務(wù)是訪問行中的不同屬性即可。
屬性集鎖為多用戶數(shù)據(jù)訪問產(chǎn)生了最大的靈活性,但它需要很高的系統(tǒng)開銷。
九、并發(fā)控制的時間戳方法
時間戳是由DBMS創(chuàng)建的唯一標(biāo)識符,用于表示事務(wù)的相對啟動時間。時間戳可以看成是事務(wù)的啟動時間。由此,時間戳是并發(fā)控制的一個方法,在這個方法中,每個事務(wù)被賦予一個事務(wù)時間戳。事務(wù)時間戳是一個單調(diào)增長的數(shù)字,它通常是基于系統(tǒng)時鐘的。事務(wù)被管理成按時間戳順序進行,時間戳也可以通過每當(dāng)新事務(wù)啟動時增加一個局部計數(shù)器的方法產(chǎn)生,時間戳的值產(chǎn)生一個顯式的順序,這個順序是事務(wù)提交給DBMS的順序。時間戳必須有兩個性質(zhì),即唯一性和單調(diào)性。唯一性假設(shè)不存在相同的時間戳值,單調(diào)性假設(shè)時間戳值總是增加的。在相同事務(wù)中對數(shù)據(jù)庫的Read和Write操作必須有相同的時間戳。DBMS按時間戳順序執(zhí)行沖突操作,因此確保了事務(wù)的可串行性。如果兩個事物沖突了,則通常是停止一個事務(wù),重新調(diào)度這個事務(wù)并賦予一個新的時間戳值。
9.1 粒度時間戳
粒度時間戳是最后一個事務(wù)訪問它的時間戳的一個記錄,一個活動事務(wù)訪問的每個粒度必須有一個粒度時間戳??梢员A糇詈笠粋€讀和寫訪問的每個記錄。如果它們的存儲包括粒度,粒度時間戳可能對讀訪問引起額外的寫操作。粒度時間戳表中的每一項由粒度標(biāo)識符和事物時間戳組成,同時維護從表中刪除的包含最大(最近的)粒度時間戳的記錄。對粒度時間戳的查找可以使用粒度標(biāo)識符,也可以使用最大被刪除的時間戳。
9.2 時間戳排序
下述是基于時間戳的并發(fā)控制方法中的三個基本算法:
(1)總時間戳排序
總時間戳排序算法依賴于在時間戳排序中對訪問粒度的維護,他是在沖突訪問中終止一個事務(wù)。讀和寫的訪問之間沒有區(qū)別。因此,對每個粒度時間戳來說只需要一個值。
(2)部分時間戳排序
只排序不可交換的活動來提高總的時間戳排序。在這種情況下,同時存儲讀和寫粒度時間戳。這個算法允許比最后一個更改粒度的事務(wù)晚的任何事務(wù)讀取粒度。如果某個事務(wù)試圖更改之前已經(jīng)被事務(wù)訪問的粒度,則終止此事務(wù)。部分時間戳排序算法比總時間戳排序算法終止的事務(wù)少,但是其代價是需要存儲粒度時間戳的額外空間。
(3)多版本時間戳排序
此算法存儲幾個被更改粒度的版本,允許事務(wù)為它訪問的所有粒度查看一致的版本集合。因此,這個算法降低了重新啟動那些有寫—寫沖突的事務(wù)而產(chǎn)生的沖突。每次對粒度的更新都創(chuàng)建一個新的版本,這個版本包含相關(guān)的粒度時間戳。因此,多版本的時間戳等于或只剛剛小于此事務(wù)的時間戳。
9.3 解決時間戳中的沖突
為處理時間戳算法中的沖突,讓包含在沖突中的一些事務(wù)等待并終止其他的一些事務(wù)。下面是時間戳中主要的沖突解決策略:
等待—死亡(Wait-Die): 如果新的事務(wù)已經(jīng)首先訪問了粒度的話,則舊的事務(wù)等待新的事務(wù)。如果新的事務(wù)試圖在舊的并發(fā)事務(wù)之后訪問粒度,則新的事務(wù)被終止(死亡)并重新啟動。
受傷—等待(Wound-Wait): 如果新的事務(wù)試圖在舊的并發(fā)事務(wù)之后訪問一個粒度,則先懸掛(受傷)新的事務(wù)。如果新的事務(wù)已經(jīng)訪問了兩者都希望的粒度的話,則舊的事務(wù)將等待新的事務(wù)提交。
終止事務(wù)的處理是沖突解決方案中一個重要的方面。在這種情況下,被終止的事務(wù)是正在請求訪問的事務(wù),這個事務(wù)必須用一個新的時間戳重新啟動。如果與其他事務(wù)有沖突的話,事務(wù)有可能被重復(fù)終止。由于出現(xiàn)沖突而使得之前的訪問粒度被終止的事務(wù)可以用相同的時間戳重新啟動,通過消除出現(xiàn)事務(wù)被持續(xù)地關(guān)在外面的可能性,這種方法將獲得高的優(yōu)先權(quán)。
9.4 時間戳的缺點
(1)存儲在數(shù)據(jù)庫中的每個值需要兩個附加的時間戳字段,一個用于存儲最后讀此字段(屬性)的時間,另一個用于存儲最后更改此字段的時間。文章來源:http://www.zghlxwxcb.cn/news/detail-411607.html
(2)它增加了內(nèi)存需求以及處理數(shù)據(jù)庫的開銷。文章來源地址http://www.zghlxwxcb.cn/news/detail-411607.html
到了這里,關(guān)于【數(shù)據(jù)庫原理 ? 七】數(shù)據(jù)庫并發(fā)控制的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!