解釋兩階段鎖定 (2PL) 協議 (DBMS)
資料庫的鎖定和解鎖應該以一種不會出現不一致性、死鎖和飢餓的方式進行。
2PL 鎖定協議
每個事務將以兩個不同的階段鎖定和解鎖資料項。
增長階段 - 所有鎖都在此階段發出。在對資料項的所有更改提交後,不會釋放任何鎖,然後第二階段(收縮階段)開始。
收縮階段 - 此階段不會發出任何鎖,所有對資料項的更改都會被記錄(儲存),然後釋放鎖。
2PL 鎖定協議的示意圖如下所示:
在增長階段,事務到達一個點,此時它可能需要的所有鎖都已獲取。這個點稱為鎖定點。
鎖定點到達後,事務進入收縮階段。
型別
兩階段鎖定有兩種型別:
嚴格的兩階段鎖定協議
事務可以在鎖定點之後釋放共享鎖,但它不能在事務提交之前釋放任何排他鎖。此協議建立了一個級聯較少的排程。
級聯排程:在此排程中,一個事務依賴於另一個事務。因此,如果一個事務需要回滾,則另一個事務也必須回滾。
嚴格的兩階段鎖定協議
事務不能在提交之前釋放任何鎖,無論是共享鎖還是排他鎖。
2PL 協議保證可序列化,但不能保證不會發生死鎖。
示例
假設 T1 和 T2 是兩個事務。
T1=A+B 和 T2=B+A
T1 | T2 |
---|---|
Lock-X(A) | Lock-X(B) |
讀取 A; | 讀取 B; |
Lock-X(B) | Lock-X(A) |
這裡,
Lock-X(B):由於 B 被 T2 鎖定,因此無法執行 Lock-X(B)。
Lock-X(A):由於 A 被 T1 鎖定,因此無法執行 Lock-X(A)。
在上述情況下,T1 等待 B,T2 等待 A。等待時間永無止境。至少在其中一個事務自願釋放鎖之前,這兩個事務都無法繼續執行。這種情況稱為死鎖。
等待圖如下所示:
等待圖:它用於死鎖檢測方法,為每個事務建立一個節點,如果 Ti 正在等待鎖定由 Tj 鎖定的專案,則建立一條從 Ti 到 Tj 的邊。WFG 中的迴圈表示發生了死鎖。WFG 定期建立。
廣告