鎖是 DBMS 中維護并發(fā)控制的一個組成部分。任何實現(xiàn)基于鎖的并發(fā)控制的系統(tǒng)中的事務在獲得所需的鎖之前都無法讀取或寫入語句。
基于鎖的協(xié)議中有兩種類型的鎖。它們是:
- 二進制鎖 – 它們只能處于鎖定或解鎖兩種狀態(tài)之一。共享/獨占鎖 – 僅在執(zhí)行讀操作時獲取共享鎖。共享鎖可以在多個事務之間共享,因為沒有數(shù)據(jù)被更改。執(zhí)行寫操作時使用排它鎖。只有持有排它鎖的事務才允許更改數(shù)據(jù)值。
不同的鎖定協(xié)議是 –
簡單鎖定協(xié)議
在執(zhí)行寫操作之前,事務會獲得數(shù)據(jù)值上的鎖。寫操作完成后,就可以釋放鎖了。簡單鎖定協(xié)議的一個示例是:
| T1 | T2 |
|---|---|
| R(A) | |
| R(A) | |
| 鎖定(B) | |
| R(B) | |
| W(B) | |
| 解鎖(B) | |
| 鎖定(C) | |
| R(C) | |
| W(C) | |
| 解鎖(C) | |
| 提交 | |
| 提交 |
上面顯示了兩個事務T1和T2。讀操作不需要鎖,但在寫操作之前,每個事務都會獲取鎖并在之后釋放鎖。
兩階段鎖定協(xié)議
兩階段鎖定協(xié)議有兩個階段,即增長階段和收縮階段。事務只有在增長階段才能獲取鎖。當進入收縮階段時,它可以釋放之前獲取的鎖,但無法獲取新的鎖。排它鎖由 X 表示,共享鎖由 S 表示。兩階段鎖定協(xié)議的示例是 –
| T1 | T2 |
|---|---|
| S(A) | |
| R(A) | |
| S(A) | |
| R(A) | |
| X(B) | |
| R(B) | |
| W(B) | |
| X(C) | |
| R(C) | |
| W(C) | |
| 解鎖(C) | |
| 解鎖(A) | |
| 解鎖(B) | |
| 解鎖(A) | |
| 提交 | |
| 提交 |
在上面的示例中,T1和T2使用共享變量A共享鎖,因為在 A 上只執(zhí)行讀操作。T1 為寫操作獲取 B 上的排他鎖,并很快釋放它。 T2與C的做法相同。
嚴格兩相鎖定協(xié)議
嚴格兩相鎖定協(xié)議與兩相鎖定協(xié)議類似。唯一的區(qū)別是,在嚴格的 2PL 協(xié)議中,協(xié)議獲取的所有排他鎖都需要保留,直到協(xié)議提交或中止。嚴格兩階段鎖定協(xié)議的示例是:
| T1 | T2 |
|---|---|
| S(A) | |
| R(A ) | |
| S(A) | |
| R(A) | |
| X(B) | |
| R(B) | |
| W(B) | |
| X(C) | |
| R(C) | |
| W(C) | |
| 解鎖(A) | |
| 解鎖(A) | |
| 提交 | |
| 解鎖(B) | |
| 提交 | |
| Unlock(C) |
在上面的例子中,T1和T2使用共享鎖共享變量A,因為對A只執(zhí)行讀操作T1 為寫操作獲取 B 上的排它鎖,T2 為 C 獲取排它鎖。只有在事務提交后才會釋放排它鎖。然而,共享鎖則沒有這樣的限制。
嚴格兩階段鎖定協(xié)議
嚴格兩階段鎖定協(xié)議僅僅是兩階段鎖定協(xié)議和嚴格兩階段鎖定協(xié)議的擴展。鎖定協(xié)議。在這里,事務持有的所有鎖,無論是共享的還是獨占的,只有在事務提交或中止時才會釋放。嚴格兩階段鎖定協(xié)議的一個示例是:
| T1 | T2 |
|---|---|
| S(A) | |
| R(A ) | |
| S(A) | |
| R(A) | |
| X(B) | |
| R(B) | |
| W(B) | |
| X(C) | |
| R(C) | |
| W(C) | |
| 提交 | |
| 解鎖(A) | |
| 解鎖(B) | |
| 提交 | |
| 解鎖(A) | |
| Unlock(C) |
在上面的例子中,T1和T2使用共享鎖共享變量A,因為對A只執(zhí)行讀操作. T1 在 B 上獲取排他鎖進行寫操作,T2 在 C 上進行同樣的操作。共享鎖和排它鎖都只有在事務提交后才會釋放。
以上就是在 DBMS 中使用鎖進行并發(fā)控制的詳細內(nèi)容,更多請關注www.92cms.cn其它相關文章!






