據稱兩相鎖定是一種確保串行執行的解決方案。但是,我不確定它如何充分解決讀取-修改-寫入周期中丟失更新的問題。我可能會忽略/誤解這里的鎖定機制!
例如,假設我們有一個使用 2PL 運行的資料庫:
account給定一個帶有整數列的 SQL 表email_count,假設我們的資料庫中有以下記錄:
| ID | email_count |
| ----- | ----- |
| 1 | 0 |
現在假設我們有兩個并發執行的事務,T1并且T2. 兩個事務都email_count將從accountsID = 1 的位置讀取,將計數值加 1,然后寫回結果。
這是 2PL 似乎無法解決丟失更新問題的一種情況( T1 代表事務 1):
T1 -> 獲得一個非獨占的共享讀鎖。從 ID = 1 讀取email_count。獲取結果 0。應用程式為以后的寫入設定一個新值 (0 1 = 1)。
T2 -> 也獲得一個非獨占的共享讀鎖。從 `email_count' 讀取 ID = 1。得到結果 0。應用程式還設定一個新值(使用現在陳舊的前置條件),即 1 (0 1 = 1)。
T1 -> 獲得獨占寫鎖并將新值 (1) 寫入我們的記錄。這將阻止 T2 寫入。
T2 -> 嘗試獲取寫鎖,以便寫入值 1,但被迫等待 T1 完成其事務并釋放 T1 自己的所有鎖。
現在這是我的問題:
一旦 T1 完成并釋放它的鎖(在我們的 2PL 的“收縮”階段),T2的舊值仍然是 1!email_count因此,當 T1 完成并且 T2 繼續寫入(使用email_count= 1)時,我們將“丟失”來自 T1 的原始更新。
uj5u.com熱心網友回復:
如果 T2 有讀鎖,則在 T2 釋放讀鎖之前,T1 無法獲得排他鎖。因此,您描述的執行順序不會發生。T1 將被拒絕寫鎖,并且 T2 繼續事務。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/446371.html
上一篇:如何將Roomdb從1遷移到2?
下一篇:想要搜索兩個表PythonSQL
