1. 程式人生 > 其它 >資料庫系統之事務處理-3

資料庫系統之事務處理-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)

原則

  1. 排程程式要維護和測試序列圖。
  2. 如果事務發出的操作違反了衝突可序列化,即如果它在序列化圖中建立了一個迴圈,則該事務將被中止。

問題

  1. Cascading aborts:如果建立資料項x的事務T被中止,那麼所有讀取x新值的事務都必須中止。

  2. 效能:測試序列化圖的非迴圈性具有O(n2)複雜度。

兩段鎖協議(2PL)

原則

  1. 對資料項的訪問由共享(讀)和排他(寫)鎖控制。
  2. 只有當一個數據項被同一個事務鎖住讀或寫,或者這個資料項被另一個事務鎖住讀,那麼這個事務才能讀該資料項。
  3. 只有當一個數據項被同一個事務上寫鎖時,這個事務才能寫該資料項。
  4. 每個事務在釋放任何鎖之前必須獲得所有鎖。
    兩段鎖協議屬於悲觀(pessimistic)協議的一類。

問題

  1. 死鎖 (Deadlocks)。
  2. 當執行可衝突序列化時會產生不必要的鎖和延遲。

一個由兩段鎖協議控制的執行例子:

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)

原則

  1. 每個事務在其起始點獲得一個時間戳。
  2. 每當事務以讀或寫模式訪問資料項時,資料項都會被打上標記(戳)。
  3. 允許按時間戳的遞增順序訪問資料項。
    時間戳排序協議屬於一類樂觀(optimistic)協議。

問題

  1. Cascading aborts
  2. 當執行衝突可序列化時會發生不必要的中斷(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

  1. T. Connoly, C. Begg, Database Systems, A Practical Approach to Design, Implementation, and Management, Chapter 22.2 Concurrency Control, Pearson Education Ltd, 2015.