資料庫管理系統 (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 也執行相同的操作。共享鎖和排它鎖只有在事務提交後才能釋放。
廣告
資料結構
網路
關係資料庫管理系統 (RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C 程式設計
C++
C#
MongoDB
MySQL
JavaScript
PHP