DBMS - 併發控制



在多個事務可以同時執行的多程式環境中,控制事務的併發性非常重要。我們有併發控制協議來確保併發事務的原子性、隔離性和可序列性。併發控制協議可以大致分為兩類:

  • 基於鎖的協議
  • 基於時間戳的協議

基於鎖的協議

配備了基於鎖的協議的資料庫系統使用一種機制,透過該機制,任何事務在獲取相應鎖之前都不能讀取或寫入資料。鎖有兩種:

  • 二元鎖 - 資料項上的鎖可以處於兩種狀態;要麼被鎖定,要麼未鎖定。

  • 共享/排他 - 這種型別的鎖定機制根據鎖的使用方式區分鎖。如果獲取資料項上的鎖以執行寫操作,則它是排他鎖。允許多個事務寫入同一資料項會導致資料庫進入不一致狀態。讀取鎖是共享的,因為沒有更改任何資料值。

有四種類型的鎖協議可用:

簡單鎖協議

簡單的基於鎖的協議允許事務在執行“寫”操作之前獲取每個物件的鎖。事務可以在完成“寫”操作後解鎖資料項。

預宣告鎖協議

預宣告協議評估其操作並建立需要鎖定的資料項列表。在啟動執行之前,事務會預先向系統請求它需要的所有鎖。如果所有鎖都被授予,則事務執行並在所有操作完成後釋放所有鎖。如果未授予所有鎖,則事務回滾並等待直到所有鎖都被授予。

Pre-claiming

兩階段鎖定 2PL

此鎖定協議將事務的執行階段分為三個部分。在第一部分,當事務開始執行時,它會請求其所需的鎖的許可權。第二部分是事務獲取所有鎖的地方。一旦事務釋放其第一個鎖,第三階段就開始了。在此階段,事務不能再請求任何新鎖;它只能釋放已獲取的鎖。

Two Phase Locking

兩階段鎖定有兩個階段,一個是增長階段,其中所有鎖都被事務獲取;第二個階段是縮減階段,其中事務持有的鎖被釋放。

要宣告排他(寫)鎖,事務必須首先獲取共享(讀)鎖,然後將其升級為排他鎖。

嚴格兩階段鎖定

嚴格 2PL 的第一階段與 2PL 相同。在第一階段獲取所有鎖後,事務繼續正常執行。但與 2PL 相比,嚴格 2PL 在使用後不會釋放鎖。嚴格 2PL 保持所有鎖直到提交點,並在同一時間釋放所有鎖。

Strict Two Phase Locking

嚴格 2PL 沒有像 2PL 那樣級聯中止。

基於時間戳的協議

最常用的併發協議是基於時間戳的協議。此協議使用系統時間或邏輯計數器作為時間戳。

基於鎖的協議在執行時管理事務之間衝突對的順序,而基於時間戳的協議在事務建立後立即開始工作。

每個事務都有一個與其關聯的時間戳,並且順序由事務的年齡決定。在 0002 時鐘時間建立的事務將比其後出現的其他所有事務都舊。例如,任何在 0004 進入系統的事務“y”都年輕兩秒,並且優先順序將給予較舊的事務。

此外,每個資料項都賦予最新的讀取和寫入時間戳。這使系統能夠知道上次對資料項執行“讀取和寫入”操作的時間。

時間戳排序協議

時間戳排序協議確保事務在其衝突的讀寫操作中的可序列性。這是協議系統應確保衝突對的任務應根據事務的時間戳值執行的責任。

  • 事務 Ti 的時間戳表示為 TS(Ti)。
  • 資料項 X 的讀取時間戳表示為 R-timestamp(X)。
  • 資料項 X 的寫入時間戳表示為 W-timestamp(X)。

時間戳排序協議的工作原理如下:

  • 如果事務 Ti 發出 read(X) 操作:

    • 如果 TS(Ti) < W-timestamp(X)
      • 操作被拒絕。
    • 如果 TS(Ti) >= W-timestamp(X)
      • 操作執行。
    • 所有資料項時間戳更新。
  • 如果事務 Ti 發出 write(X) 操作:

    • 如果 TS(Ti) < R-timestamp(X)
      • 操作被拒絕。
    • 如果 TS(Ti) < W-timestamp(X)
      • 操作被拒絕,Ti 回滾。
    • 否則,操作執行。

托馬斯寫規則

此規則指出,如果 TS(Ti) < W-timestamp(X),則操作被拒絕,Ti 回滾。

可以修改時間戳排序規則以使排程檢視可序列化。

而不是使 Ti 回滾,“寫”操作本身會被忽略。

廣告