併發
事務:一次讀寫操作序列
調度:一個或者多個事務的重要操作按時間順序執行的一個序列。
串行調度:不同事務在執行過程中沒有交叉的調度。
導致數據庫狀態不一致的可能原因:故障發生、併發事務數據的共享
併發操作可能引起數據的不一致:丟失修改、不可重複讀、讀取到髒數據
Why:事務的隔離性被破壞,事務間相互干擾
併發控制的目的
控制併發事務的執行步驟保證事務都可以正確的執行,從而保證數據庫的一致性。
操作部件:事務管理器的調度器
可串行化調度及其判定方法
可串行性: 多個事務的併發執行是正確的,當且僅當其結果與按某一次序串行地執行它們時的結果相同。
併發事務操作的正確與否: 是否具有可串行性
併發控制思想: 延遲一些操作,甚至終止一些操作。
關於衝突
衝突的操作 : 涉及同一數據元素,且至少有一個寫操作。
如果一個調度衝突等價於一個串行調度,我們說該調度是 衝突可串行化
的。
衝突可串行化
調度是可串行調度的 充分條件。
優先圖P(S):
結點:表示調度S中的事務
弧:當下列條件成立時, 可畫弧
- 是S 中的操作 (即:來自不同事務的兩個
操作涉及同一元素
) - (即: p i (A) 發生在q j (A) 之前 )
- 和 中
至少一個是寫操作
判斷調度S是否衝突可串行化:
構造S的優先圖,並判斷其中
是否有環
。如果有,則S不是衝突可串行化的,否則,S 是衝突可串行化的。
有向無環圖的拓撲排序問題
併發控制的主要技術
- 封鎖技術
- 時間戳
- 有效性檢查
封鎖技術
lock、unlock
- 事務在讀寫操作之前需要對元素進行加鎖lock,時候解鎖unlock。
- 任何兩個事務不能同時封鎖同一元素。
- 兩階段鎖(2PL) ,在對數據讀寫之前首先申請並獲得封鎖(上升階段),釋放一個封鎖後不再申請和獲得任何其他封鎖(收縮階段)
2PL:讀寫之前加鎖,解鎖時候不獲取任何鎖
死鎖預防
- 一次封鎖法
- 順序封鎖法
死鎖診斷與解決
- 診斷 :超時法,等待圖法
- 解決 : 選擇一個處理死鎖代價最小的事務,強行撤銷。
共享鎖
讀操作並不會產生衝突!!!
提出兩種類型的鎖:
- 共享鎖(讀鎖,S 鎖)
- 排它鎖 (寫鎖,X 鎖)
三個規則:(滿足則調度是可串行的)
- 事務的一致性,讀前加 S鎖,寫前加 X 鎖,處理結束要解鎖
- 對A加S鎖後,未釋放前不可加X鎖;對A加X鎖後,未解鎖前不可加S或者X鎖.
- 2PL:鎖升級;
a. 如果鎖升級採用申請多個鎖的方式(如) ,則沒有變化。
b. 如果鎖升級時採用先釋放再申請的方式(如 ) ,則在上升階段允許。
封鎖協議及事務隔離程度
封鎖協議
一級封鎖協議
修改數據之前加X鎖,直至事務結束
solve:丟失修改
二級封鎖協議
寫數據之前加X鎖,直至事務結束
讀取數據之前加S鎖,讀完釋放
solve:丟失修改、讀髒數據
三級封鎖協議
寫數據之前加X鎖,直至事務結束
讀數據之前加S鎖,直至事務結束
solve:丟失修改、讀髒數據、不可重複讀
隔離程度
- 可串行化
- 可重複讀:一個事務兩次讀取數據項期間,其他事務不得更新數據
- 已提交讀:只允許讀取已提交數據,但不要求可重複讀
- 未提交讀:只能讀取未提交數據
均不允許“髒寫”,數據在被一個事務寫的時候,在未提交或中止之前不允許其他事務進行寫操作。