DBMS 中使用鎖進行併發控制
鎖是維護 DBMS 中併發控制不可或缺的一部分。在任何實現基於鎖的併發控制的系統中,事務在獲得所需的鎖之前都不能讀取或寫入語句。
基於鎖的協議中有兩種型別的鎖。它們是
- 二元鎖 - 這些鎖只能處於兩種狀態之一:鎖定或解鎖。
- 共享/排他鎖 - 當僅執行讀取操作時,會獲取共享鎖。多個事務可以共享共享鎖,因為沒有資料被更改。當執行寫入操作時,使用排他鎖。只有持有排他鎖的事務才能更改資料值。
不同的鎖定協議如下:
簡單鎖定協議
在執行寫入操作之前,事務會在資料值上獲得鎖。寫入操作完成後,可以釋放鎖。簡單鎖定協議的一個示例是
T1 | T2 |
---|---|
R(A) | |
R(A) | |
Lock(B) | |
R(B) | |
W(B) | |
Unlock(B) | |
Lock(C) | |
R(C) | |
W(C) | |
Unlock(C) | |
Commit | |
Commit |
上面顯示了兩個事務 T1 和 T2。讀取操作不需要鎖,但在寫入操作之前,每個事務都會獲取一個鎖並在之後釋放它。
兩階段鎖定協議
兩階段鎖定協議有兩個階段,即增長階段和收縮階段。事務只有在增長階段才能獲取鎖。當它進入收縮階段時,它可以釋放之前獲取的鎖,但不能獲取新的鎖。排他鎖由 X 表示,共享鎖由 S 表示。兩階段鎖定協議的一個示例如下:
T1 | T2 |
---|---|
S(A) | |
R(A) | |
S(A) | |
R(A) | |
X(B) | |
R(B) | |
W(B) | |
X(C) | |
R(C) | |
W(C) | |
Unlock(C) | |
Unlock(A) | |
Unlock(B) | |
Unlock(A) | |
Commit | |
Commit |
在上面的示例中,T1 和 T2 使用共享鎖共享變數 A,因為僅對 A 執行讀取操作。T1 獲取對 B 的排他鎖以進行寫入操作,並在之後立即釋放它。T2 對 C 執行相同的操作。
嚴格兩階段鎖定協議
嚴格兩階段鎖定協議類似於兩階段鎖定協議。唯一的區別在於,在嚴格 2PL 協議中,協議獲取的所有排他鎖都需要保持,直到協議提交或中止。嚴格兩階段鎖定協議的一個示例是
T1 | T2 |
---|---|
S(A) | |
R(A) | |
S(A) | |
R(A) | |
X(B) | |
R(B) | |
W(B) | |
X(C) | |
R(C) | |
W(C) | |
Unlock(A) | |
Unlock(A) | |
Commit | |
Unlock(B) | |
Commit | |
Unlock(C) |
在上面的示例中,T1 和 T2 使用共享鎖共享變數 A,因為僅對 A 執行讀取操作。T1 獲取對 B 的排他鎖以進行寫入操作,T2 對 C 執行相同的操作。排他鎖僅在事務提交後才釋放。但是,共享鎖沒有此類限制。
嚴格兩階段鎖定協議
嚴格兩階段鎖定協議僅僅是兩階段鎖定協議和嚴格兩階段鎖定協議的擴充套件。在這裡,事務持有的所有鎖,無論是共享鎖還是排他鎖,都只在事務提交或中止後才釋放。嚴格兩階段鎖定協議的一個示例是
T1 | T2 |
---|---|
S(A) | |
R(A) | |
S(A) | |
R(A) | |
X(B) | |
R(B) | |
W(B) | |
X(C) | |
R(C) | |
W(C) | |
Commit | |
Unlock(A) | |
Unlock(B) | |
Commit | |
Unlock(A) | |
Unlock(C) |
在上面的示例中,T1 和 T2 使用共享鎖共享變數 A,因為僅對 A 執行讀取操作。T1 獲取對 B 的排他鎖以進行寫入操作,T2 對 C 執行相同的操作。共享鎖和排他鎖都只在事務提交後才釋放。