上篇部落格通過一些例項介紹了併發導致的資料不一致一系列問題——丟失修改、讀髒資料、不可重複讀
本篇部落格介紹如何進行併發控制。
——封鎖。
(1)封鎖就是事務
t在對某資料物件
(例如:表、記錄
)操作之前,先向系統發出請求,對其加鎖(2
)加鎖後事務
t就對資料物件有了一定的控制,在事務
t釋放它的鎖之前,其他的事務不能更新此資料物件
不同的鎖有不同的控制功能;即,乙個事務對資料物件加鎖後可有怎樣的控制由它的封鎖型別決定。a.
含義:若事務
t對資料物件a加上
x鎖,則只允許
t讀取和修改
a,其他任何事務都不能再對
a加任何型別的鎖,直到t釋放
a上的鎖。b.
功能:保證其他事務在事務
t釋放資料物件
a上的鎖之前不能在讀和修改a。
a.含義:若事務
t對資料物件a加上
s鎖,則其他事務只能再對a加
s鎖,而不能加
x鎖,直到t釋放
a上的s鎖
b.功能:保證其他事務可以讀資料物件
a,但在事務t釋放
a上的s鎖之前不能對
a做任何修改、
關注點在**,一級封鎖協議的關注點是事務修改的資料,二級和**是事務讀取的資料
a.內容:事務
t在修改資料物件
a之前必須對其加
x鎖,直到
事務結束才釋放。b.
可解決的問題:「丟失修改」問題t1
t2 解釋
①xlock a 事務
t1在讀
a進行修改之前先對a加
x鎖 ②
r(a)=16
xlock a當t2
再請求對a加
x鎖時被拒絕 ③
a←a-1
等待t2
只能等待
t1釋放
a上的鎖後
t2獲得對a的
x鎖w(a)=15
等待commit
等待unlock a等待④
獲得xlock a
r(a)=15
這時t2
讀到的a
已經是t1
更新過的值15
a←a-1
t2按此新的
a值進行運算,並將結果值
a=14
送回到磁碟。避免了丟失
t1的更新。 ⑤
w(a)=14
commit
unlock a
思考:一級封鎖協議為什麼不能解決髒讀和不可重複讀問題?
在一級封鎖協議中,如果僅僅是讀資料不對其進行修改,是不需要加鎖的,所以它不能保證可重複讀和不讀「髒」資料。即,事務1對r加了排他鎖,對資料r進行了修改,若事事務2對r申請鎖,則會wait;若事務2不對r申請任何鎖,則即使事務1對r加了排他鎖,事務2也會無視,可以讀!所以不能解決髒讀和不可重複讀問題a.
內容:在一級封鎖協議的基礎上,另外加上事務
t在讀取資料物件
a之前必須對其加s鎖,
讀完後立即釋放。b
.可以解決的問題:「丟失修改」、「讀髒資料」問題
t1t2解釋
①xlock c 事務
t1在對
c進行修改之前,先對c加
x鎖,修改其值後寫回磁碟
r(c)=100
c←c*2
w(c)=200
②slock c
t2請求在c上加
s鎖,因
t1已在
c上加了x鎖,
t2只能等待
等待 ③
rollback等待
(c恢復為100)等待
t1因某種原因被撤銷,
c恢復為原值
100
unlock c 等待
④ 獲得slock c
r(c)=100 t1
釋放c上的x
鎖後t2獲得c
上的s鎖,讀c=100
。避免了
t2讀「髒」資料 ⑤
commit c
unlock c
思考:為什麼二級封鎖不能解決「不可重複讀」問題?
——事務
1讀取資料時加上共享鎖後(這樣在事務1讀取資料的過程中,其他事務就不會修改該資料),
不允許任何事物操作該資料,只能讀取,之後
1如果有更新操作,那麼會轉換為排他鎖,其他事務更無權參與進來讀寫,
這樣就防止了髒讀問題。但是當事務
1讀取資料過程中,有可能其他事務(例如事務2)也讀取了該資料,事務1讀取完畢後共享鎖釋放(此時事務1還未完),
此時事務2
修改資料,修改完畢提交事務,那麼事務1再次讀取資料時候發現資料不一致,就會出現不可重複讀問題,
所以這樣不能夠避免不可重複讀問題。a.
內容:在一級封鎖協議的基礎上,另外加上事務
t在讀取資料物件
a之前必須對其加
s鎖,直到
事務結束才釋放。b
.可以解決的問題:「丟失修改」、「讀髒資料」、「不可重複讀」問題t1
t2解釋
事務t1在讀a
,b之前,先對a,
b加s鎖;
其他事務只能再對a,
b加s鎖,而不能加
x鎖,即其他事務只能讀a,
b,而不能修改
slock b
r(a)=50
r(b)=100
求和=150
② xlock b
當t2為修改b
而申請對b的
x鎖時被拒絕只能等待
t1釋放
b上的鎖
t1為驗算再讀a,
b,這時讀出的b仍是
100,求和結果仍為
150,即可重複讀
t1結束才釋放a,
b上的s鎖。
t2才獲得對b的
x鎖 等待
等待③r(a)=50等待
r(b)=100 等待
求和=150等待
commit 等待
unlock a 等待
unlock b 等待
④ 獲得xlockb
r(b)=100
b←b*2 ⑤
w(b)=200
commit
unlock b
注:關注點在**?
——一級封鎖協議的關注點是事務修改的資料,二級和**是事務讀取的資料
(1)鎖的相容矩陣:
(如果r
上加了x
鎖後,就不能再加任何鎖!如果
r上加了
s鎖後,只能再加
s鎖而不能再加
x鎖!) (
2) x
鎖s鎖
無丟失修改
無汙讀可更新
事務結束釋放
事務結束釋放
讀完釋放
一級封鎖協議√
√ 二級封鎖協議√
√ √√
**封鎖協議√
√ √
√ √
併發控制的主要技術 封鎖
上篇部落格通過一些例項介紹了併發導致的資料不一致一系列問題 丟失修改 讀髒資料 不可重複讀 併發操作與資料的不一致性 本篇部落格介紹如何進行併發控制。封鎖。1 封鎖就是事務 t在對某資料物件 例如 表 記錄 操作之前,先向系統發出請求,對其加鎖 2 加鎖後事務 t就對資料物件有了一定的控制,在事務 ...
回滾機制 05 基於封鎖的併發控制機制
死鎖 兩個或兩個以上事務處於等待狀態,每個事務都在等待其中另乙個事務釋放資源,導致所有事務都無法執行,這種現象稱為死鎖。處理死鎖的方法 一 引入死鎖預防協議,使系統不進入死鎖狀態 通過對加鎖請求進行排序,一事務開始前要鎖定所有的資料項 二 允許系統進入死鎖狀態,引入死鎖檢測和死鎖恢復機制進行恢復。比...
資料庫併發控制技術
事務是一系列的資料庫操作,是資料庫應用程式的基本邏輯單元,也是恢復和併發控制的基本單位。事務處理技術主要包括資料庫恢復技術和併發控制技術。本篇博文主要總結下併發控制技術。事務 是使用者定義的乙個資料庫操作序列,這些操作要麼全做,要麼全不做,是乙個不可分割的工作單位。例如,在關聯式資料庫中,乙個事務可...