使用SQL Server 取得獨佔行存取:探索SELECT FOR UPDATE
SELECT FOR UPDATE 的概念在Oracle、DB2 中眾所周知和My,允許開發人員在檢索資料時取得行上的排他鎖,防止其他並發交易修改所選資料。然而,當涉及在 SQL Server 中使用 SELECT FOR UPDATE 時,就會有一些顯著的差異。
在提供的程式碼中,嘗試使用WITH(updlock)來實現行級鎖定並沒有產生預期的結果結果,因為它還阻止其他連接選擇不同的行。為了解決這個問題,讓我們來探索SQL Server 中SELECT FOR UPDATE 的各種選項:
ROWLOCK
ROWLOCK 提示可用於設定行級鎖定,但它鎖定整行,即使對於不同行的SELECT 操作也是如此。此行為符合相同的行場景,但不符合不同的行場景。
updlock、rowlock
組合 updlock 和 rowlock 並不能改善這種情況;它仍然會導致相同和不同行 SELECT 的阻塞。
xlock,rowlock
與updlock,rowlock 一樣,這種組合提供廣泛的鎖定,影響相同和不同的排
repeatableread
Repeatableread是一種隔離級別,可防止幻讀等資料操作異常。但是,它不執行行級鎖定,因此無法滿足此要求。
DBCC TRACEON (1211,-1)
此追蹤標誌設定資料庫-wide ROWLOCK 適用於所有讀取操作,有效模擬行級鎖定。但是,它會影響所有連接,並且可能不適用於所有場景。
rowlock,xlock,holdlock
此組合還會鎖定SELECT 的整行,包括那些在不同的rows.
updlock ,holdlock
與rowlock,xlock,holdlock類似,此組合提供行級鎖定,但將其擴展為包括HOLDLOCK
UPDLOCK,READPAST
對於快照隔離級別,此組合允許對可提交讀取進行不含行鎖的SELECT。但是,它不提供獨佔鎖,可能不適合此用例。
結論
遺憾的是,所探索的選項都沒有提供 SELECT 的確切行為FOR UPDATE 與 SQL Server 的其他 DBMS 中已知的一樣。雖然行級鎖定是透過 ROWLOCK 的選項,但它也會影響其他 SELECT 操作,這可能是不可取的。在這種情況下,捕獲死鎖和快照並發問題可能是實現所需資料一致性等級的必要替代方案。
以上是如何在SQL Server中實作SELECT FOR UPDATE功能?的詳細內容。更多資訊請關注PHP中文網其他相關文章!