資料庫系統之事務處理-3
技術標籤:資料庫系統資料庫PL/SQL死鎖Deadlock序列圖
Transaction Processing
接上文
資料庫系統之事務處理-2
https://blog.csdn.net/Jifu_M/article/details/112479869
序列圖
製作序列圖規則如下:
如果事務T參與併發執行,那麼我們向序列化圖中新增一個標記為T的節點。
如果事務Ti和Tj處理衝突的操作,使得Ti首先處理它的操作,那麼我們新增一條從Ti到Tj的線。
T1 T2 T3
write(x, 10)
write(x,20)
write(x,30)
write(y,10)
read(y)
得出的序列圖如下:
序列圖測試協議(SGT)
原則
- 排程程式要維護和測試序列圖。
- 如果事務發出的操作違反了衝突可序列化,即如果它在序列化圖中建立了一個迴圈,則該事務將被中止。
問題
-
Cascading aborts:如果建立資料項x的事務T被中止,那麼所有讀取x新值的事務都必須中止。
-
效能:測試序列化圖的非迴圈性具有O(n2)複雜度。
兩段鎖協議(2PL)
原則
- 對資料項的訪問由共享(讀)和排他(寫)鎖控制。
- 只有當一個數據項被同一個事務鎖住讀或寫,或者這個資料項被另一個事務鎖住讀,那麼這個事務才能讀該資料項。
- 只有當一個數據項被同一個事務上寫鎖時,這個事務才能寫該資料項。
- 每個事務在釋放任何鎖之前必須獲得所有鎖。
兩段鎖協議屬於悲觀(pessimistic)協議的一類。
問題
- 死鎖 (Deadlocks)。
- 當執行可衝突序列化時會產生不必要的鎖和延遲。
一個由兩段鎖協議控制的執行例子:
T1 T2
lock(u)read(u)
lock (v)write(v,v+1)
write(u,u+2)
lock(v) wait
lock(x) read(x)
unlock(v)
write(x,x+2)
lock(v)
unlock(x)
write(v,v+1)
unlock(v)
unlock(u)
兩段鎖協議詳解:
結合上面4個原則來看這個例子:
T1先鎖住了u並對u進行了讀操作,之後T2鎖住v並對v進行寫操作。
T1對u進行寫操作後,他想對v進行操作所以想要鎖住v,可是v已經被T2鎖住了,所以T1對v的操作無法進行,需要等待T2解鎖v。
T2這時候鎖住了x並對x進行了讀操作,這時候T2已經得到了他想要的所有鎖,所以他可以解鎖v。(原則4)解鎖v後對T2進行了寫操作。
T1在T2解鎖v後成功鎖住了v,T2已經完成了所有操作,所以對x也進行解鎖。
T1對v進行寫操作後也完成了所有操作,所以T1解鎖呵呵v和u。
那麼,如果T2在解鎖v之前還想要對u進行操作,但是u已經被T1鎖住了,T1又等著T2解鎖v對v進行操作,T1無法提前解鎖u因為他沒有獲得他想要操作的所有鎖。那麼會發生什麼呢?
這就是死鎖 Deadlocks~!
死鎖 Deadlocks
死鎖的例子如下:
T1 T2
lock(u) read(u)
lock(v) write(v,v+1)
lock(v) wait
lock(u) wait
在資料庫系統中,死鎖可以通過wait for graph或通過 timeout來消除。
我在 PL/SQL做了一個觸發死鎖的專案練習,可以進行參考學習:
https://blog.csdn.net/Jifu_M/article/details/112490739
時間戳排序協議(Timestamp ordering(TO) protocol)
原則
- 每個事務在其起始點獲得一個時間戳。
- 每當事務以讀或寫模式訪問資料項時,資料項都會被打上標記(戳)。
- 允許按時間戳的遞增順序訪問資料項。
時間戳排序協議屬於一類樂觀(optimistic)協議。
問題
- Cascading aborts
- 當執行衝突可序列化時會發生不必要的中斷(aborts)。
一個由時間戳排序協議控制的執行例子:
T1 T2 x
timestamp(t1)
read(x) x:t1
write(x,x-10)
timestamp(t2)
write(x) x:t1:t2
read(y) y:t2
read(y) y:t2:t1
write(y,y+1) y:t2:t1
abort
References
- T. Connoly, C. Begg, Database Systems, A Practical Approach to Design, Implementation, and Management, Chapter 22.2 Concurrency Control, Pearson Education Ltd, 2015.