如何跳過被選中的持有鎖的行?
Begin tran
Select *
From table with(holdlock)
Where id = 2
在第二個會話中,當執行查詢時,結果中應跳過 id 值為 2 的行。
uj5u.com熱心網友回復:
本(holdlock)持有鎖,直到事務結束-但是這是一個共享鎖-如其他讀者不會阻止由鎖...
如果你真的必須這樣做,你需要建立(并持有)一個排他鎖
Begin tran
Select *
From table with (updlock, holdlock)
Where id = 2
并WITH (READPAST)在第二個會話中使用子句,不被排他鎖停止。
PS:更新為使用updlock,基于@charlieface 的推薦 - 謝謝!
uj5u.com熱心網友回復:
我想,你可以試試 READPAST-hint
https://www.sqlshack.com/explore-the-sql-query-table-hint-readpast/
uj5u.com熱心網友回復:
READPAST將跳過現有的鎖。但是你需要另一個鎖提示,否則SELECT不會保持鎖。
XLOCK, HOLDLOCK(aka SERIALIZABLE) 是一個選項,但可以是限制性的。
您可以使用UPDLOCK保持鎖定直到事務結束。UPDLOCK生成一個U鎖,它會阻止其他鎖U或X(獨占寫入器)鎖,但仍允許S讀取器鎖。所以資料仍然可以被一個只讀行程讀取,但是另一個執行相同代碼的行程仍然會被阻塞。
Begin tran
Select *
From table WITH (UPDLOCK, READPAST)
Where id = 2
-- etc
uj5u.com熱心網友回復:
我在第二個會話中使用以下代碼實作了這一點。
SET TRANSACTION ISOLATION LEVEL REPEATABLE READS
Select * from table WITH (Readpast)
謝謝大家的幫助。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/377490.html
標籤:sql sql-server 查询语句 交易
