国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【數(shù)據(jù)庫原理 ? 七】數(shù)據(jù)庫并發(fā)控制

這篇具有很好參考價值的文章主要介紹了【數(shù)據(jù)庫原理 ? 七】數(shù)據(jù)庫并發(fā)控制。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

前言

數(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)知識也已成為每個人必須掌握的知識。

【數(shù)據(jù)庫原理 ? 七】數(shù)據(jù)庫并發(fā)控制

一、并發(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ū)別在于什么操作需要申請封鎖,以及何時釋放鎖(即持鎖時間)。

【數(shù)據(jù)庫原理 ? 七】數(shù)據(jù)庫并發(fā)控制

五、活鎖和死鎖

和操作系統(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ù)釋放全部的鎖,并且不能再獲得任何新鎖。

【數(shù)據(jù)庫原理 ? 七】數(shù)據(jù)庫并發(fā)控制

上述兩階段鎖有下述規(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ù)庫中的每個值需要兩個附加的時間戳字段,一個用于存儲最后讀此字段(屬性)的時間,另一個用于存儲最后更改此字段的時間。

(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)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 數(shù)據(jù)庫DBMS并發(fā)控制

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

    ? ? 串行調(diào)度 顧名思義 就是可以進行調(diào)度的意思? 可串行調(diào)度 就是 一種和串行調(diào)度等價的并行調(diào)度 效果是一樣但是速度很快。 postgresql事務(wù)隔離級別如何查看以及設(shè)置_postgresql查看事務(wù)隔離級別_abcwywht的博客-CSDN博客 mysql數(shù)據(jù)庫事務(wù)隔離級別的查看、設(shè)置、以及隔離級別有

    2024年02月06日
    瀏覽(26)
  • 2023-08-28 數(shù)據(jù)庫-并發(fā)控制-初步思考

    此前做查詢優(yōu)化和查詢執(zhí)行比較多, 一般是在一個單獨的事務(wù)內(nèi)考慮優(yōu)化查詢. 最近在做并發(fā)控制方面的事情, 一些此前考慮的較少的方面需要做更為深入的思考. 并發(fā)控制和事務(wù)的特性息息相關(guān), 直白的說就是事務(wù)的隔離性, 但是這么理解過于膚淺, 本文做一些初步的思考. 一個

    2024年02月11日
    瀏覽(24)
  • 數(shù)據(jù)庫總復(fù)習(xí)第十一章 并發(fā)控制

    數(shù)據(jù)庫總復(fù)習(xí)第十一章 并發(fā)控制

    事務(wù)是并發(fā)控制的基本單位 并發(fā)操作帶來的數(shù)據(jù)不一致性 R(x):讀數(shù)據(jù)x W(x):寫數(shù)據(jù)x 丟失修改 T2的提交結(jié)果破壞了T1的提交結(jié)果,導(dǎo)致T1的修改被丟失 不可重復(fù)讀 T1讀取某一數(shù)據(jù),T2對其做了修改,當(dāng)事務(wù)T1再次讀該數(shù)據(jù),得到與前一次不同的值 T1讀取某些數(shù)據(jù),T2刪除其中部

    2024年01月17日
    瀏覽(23)
  • java進行數(shù)據(jù)庫操作的并發(fā)控制的2種方法

    本文分享自華為云社區(qū)《java進行數(shù)據(jù)庫操作的并發(fā)控制》,作者:張儉。 在現(xiàn)代應(yīng)用編碼中,從數(shù)據(jù)庫里面find出來,進行一些業(yè)務(wù)邏輯操作,最后再save回去。即: 但是這樣的業(yè)務(wù)操作,如果一個線程修改年齡,另一個線程修改昵稱,最后save回去,可能會導(dǎo)致年齡/昵稱某一

    2024年02月04日
    瀏覽(26)
  • 深入解析MVCC:多版本并發(fā)控制的數(shù)據(jù)庫之道

    目錄 引言 一、什么是MVCC? 二、MVCC的實現(xiàn)原理 2.1版本號 2.1.1版本號的作用: 2.1.2版本號的組成: 2.1.3.示例 2.2事務(wù)id 2.2.1事務(wù)ID的作用: 2.2.2事務(wù)ID的生成: 2.2.3示例: 2.3 快照(Snapshot) 2.3.1快照的作用: 2.3.2快照的實現(xiàn)方式: 2.3.3示例: 2.4版本鏈(Version Chain) 2.4.1版本鏈

    2024年01月24日
    瀏覽(28)
  • 系統(tǒng)架構(gòu)設(shè)計師---事務(wù)管理、并發(fā)控制、數(shù)據(jù)庫的備份與恢復(fù)

    目錄 事務(wù)管理 ? ? ? 定義 ? ? ??事務(wù)的四個特性(ACID) ? ? 相關(guān)SQL語句 并發(fā)控制 ? ? 并發(fā)操作 ? ? 封鎖 ?數(shù)據(jù)庫的備份與恢復(fù) ? ???備份(轉(zhuǎn)儲)與恢復(fù) ? ? ? ?備份分類 ? ? ? 數(shù)據(jù)庫的四類故障 ? ? ? ?? DBMS 運行的基本工作單位是事務(wù),事務(wù)是用戶定義的一個數(shù)據(jù)庫

    2024年02月12日
    瀏覽(87)
  • 【數(shù)據(jù)庫】基于時間戳的并發(fā)訪問控制,樂觀模式,時間戳替代形式及存在的問題,與封鎖模式的對比

    【數(shù)據(jù)庫】基于時間戳的并發(fā)訪問控制,樂觀模式,時間戳替代形式及存在的問題,與封鎖模式的對比

    ? 專欄內(nèi)容 : 手寫數(shù)據(jù)庫toadb 本專欄主要介紹如何從零開發(fā),開發(fā)的步驟,以及開發(fā)過程中的涉及的原理,遇到的問題等,讓大家能跟上并且可以一起開發(fā),讓每個需要的人成為參與者。 本專欄會定期更新,對應(yīng)的代碼也會定期更新,每個階段的代碼會打上tag,方便階段學(xué)

    2024年02月03日
    瀏覽(20)
  • 數(shù)據(jù)庫技術(shù)的基本概念、原理、方法和技術(shù)

    1. DB:數(shù)據(jù)庫,保存一組有組織的數(shù)據(jù)的容器; 2. DBMS: 數(shù)據(jù)庫管理系統(tǒng),又稱為數(shù)據(jù)庫軟件(數(shù)據(jù)庫產(chǎn)品),用于管理DB中的數(shù)據(jù); 3. SQL: 結(jié)構(gòu)化查詢語言,用于和DBMS通信的語言。 數(shù)據(jù)庫原理是指數(shù)據(jù)庫系統(tǒng)的基本概念和內(nèi)部工作原理。數(shù)據(jù)庫是用來管理和存儲大量數(shù)據(jù)的系

    2024年02月15日
    瀏覽(21)
  • Redis 原理緩存過期、一致性hash、雪崩、穿透、并發(fā)、布隆、緩存更新策略、緩存數(shù)據(jù)庫一致性

    Redis 原理緩存過期、一致性hash、雪崩、穿透、并發(fā)、布隆、緩存更新策略、緩存數(shù)據(jù)庫一致性

    redis的過期策略可以通過配置文件進行配置 redis會把設(shè)置了過期時間的key放在單獨的字典中,定時遍歷來刪除到期的key。 1).每100ms從過期字典中 隨機挑選20個,把其中過期的key刪除; 2).如果過期的key占比超過1/4,重復(fù)步驟1 為了保證不會循環(huán)過度,導(dǎo)致卡頓,掃描時間上限

    2024年02月08日
    瀏覽(31)
  • 大數(shù)據(jù)技術(shù)原理與應(yīng)用實驗3——NoSQL和關(guān)系數(shù)據(jù)庫的操作比較

    大數(shù)據(jù)技術(shù)原理與應(yīng)用實驗3——NoSQL和關(guān)系數(shù)據(jù)庫的操作比較

    (1)理解四種數(shù)據(jù)庫(MySQL、HBase、Redis和MongoDB)的概念以及不同點; (2)熟練使用四種數(shù)據(jù)庫操作常用的Shell命令; (3)熟悉四種數(shù)據(jù)庫操作常用的Java API。 (1)Linux操作系統(tǒng)(CentOS7.5) (2)VMware Workstation Pro 15.5 (3)遠程終端工具Xshell7 (4)Xftp7傳輸工具 (5)Hadoop版本:

    2024年02月02日
    瀏覽(14)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包