併發控制

併發

事務:一次讀寫操作序列
調度:一個或者多個事務的重要操作按時間順序執行的一個序列。
串行調度:不同事務在執行過程中沒有交叉的調度。

導致數據庫狀態不一致的可能原因:故障發生、併發事務數據的共享

併發操作可能引起數據的不一致:丟失修改、不可重複讀、讀取到髒數據
Why:事務的隔離性被破壞,事務間相互干擾
在這裏插入圖片描述


併發控制的目的

控制併發事務的執行步驟保證事務都可以正確的執行,從而保證數據庫的一致性。
操作部件:事務管理器的調度器

可串行化調度及其判定方法

可串行性: 多個事務的併發執行是正確的,當且僅當其結果與按某一次序串行地執行它們時的結果相同。

併發事務操作的正確與否: 是否具有可串行性

併發控制思想: 延遲一些操作,甚至終止一些操作。


關於衝突

衝突的操作 : 涉及同一數據元素,且至少有一個寫操作。

如果一個調度衝突等價於一個串行調度,我們說該調度是 衝突可串行化 的。

衝突可串行化調度是可串行調度的 充分條件。

優先圖P(S):
結點:表示調度S中的事務
弧:當下列條件成立時, 可畫弧TiTjTi \rightarrow Tj

  • pi(A),qj(A)p_i (A) , q_j (A) 是S 中的操作 (即:來自不同事務的兩個操作涉及同一元素
  • pi(A)<sqj(A)p_i (A) < _s q_j (A) (即: p i (A) 發生在q j (A) 之前 )
  • pip_iqjq_j至少一個是寫操作

判斷調度S是否衝突可串行化

構造S的優先圖,並判斷其中是否有環。如果有,則S不是衝突可串行化的,否則,S 是衝突可串行化的。
有向無環圖的拓撲排序問題

在這裏插入圖片描述


併發控制的主要技術

  • 封鎖技術
  • 時間戳
  • 有效性檢查

封鎖技術

lock、unlock

  1. 事務在讀寫操作之前需要對元素進行加鎖lock,時候解鎖unlock。
  2. 任何兩個事務不能同時封鎖同一元素。
  3. 兩階段鎖(2PL) ,在對數據讀寫之前首先申請並獲得封鎖(上升階段),釋放一個封鎖後不再申請和獲得任何其他封鎖(收縮階段)

2PL:讀寫之前加鎖,解鎖時候不獲取任何鎖

在這裏插入圖片描述在這裏插入圖片描述

死鎖預防

  • 一次封鎖法
  • 順序封鎖法

死鎖診斷與解決

  • 診斷 :超時法,等待圖法
  • 解決 : 選擇一個處理死鎖代價最小的事務,強行撤銷。

共享鎖

讀操作並不會產生衝突!!!
提出兩種類型的鎖:

  1. 共享鎖(讀鎖,S 鎖)
  2. 排它鎖 (寫鎖,X 鎖)

三個規則:(滿足則調度是可串行的)

  1. 事務的一致性,讀前加 S鎖,寫前加 X 鎖,處理結束要解鎖
  2. 對A加S鎖後,未釋放前不可加X鎖;對A加X鎖後,未解鎖前不可加S或者X鎖.
  3. 2PL:鎖升級;
    a. 如果鎖升級採用申請多個鎖的方式(如SS,XS \rightarrow {S, X}) ,則沒有變化。
    b. 如果鎖升級時採用先釋放再申請的方式(如 SXS \rightarrow X) ,則在上升階段允許。

封鎖協議及事務隔離程度

封鎖協議

一級封鎖協議
修改數據之前加X鎖,直至事務結束
solve:丟失修改
二級封鎖協議
寫數據之前加X鎖,直至事務結束
讀取數據之前加S鎖,讀完釋放
solve:丟失修改、讀髒數據
三級封鎖協議
寫數據之前加X鎖,直至事務結束
讀數據之前加S鎖,直至事務結束
solve:丟失修改、讀髒數據、不可重複讀

隔離程度

  • 可串行化
  • 可重複讀:一個事務兩次讀取數據項期間,其他事務不得更新數據
  • 已提交讀:只允許讀取已提交數據,但不要求可重複讀
  • 未提交讀:只能讀取未提交數據

均不允許“髒寫”,數據在被一個事務寫的時候,在未提交或中止之前不允許其他事務進行寫操作。

發佈了57 篇原創文章 · 獲贊 55 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章