如何独占锁定阻止CRUD操作的行

Ari*_*ian 11 sql t-sql sql-server sql-server-2005 sql-server-2008

嗨专家如何在sql server中锁定一行,即使是SELECT也可以阻止CRUD操作.可能吗?Serializable Isolation级别不会阻止SELECT.谢谢

Iam*_*mIC 12

BEGIN TRAN

    SELECT 1
    FROM Table
    WITH (XLOCK, ROWLOCK)

COMMIT TRAN
Run Code Online (Sandbox Code Playgroud)

那就行了.

编辑

正如其他人所说,你不能锁定一行不被阅读.我知道这样做的唯一方法如下:

WITH (UPDLOCK, TABLOCK)
Run Code Online (Sandbox Code Playgroud)

这假设从未在SELECT语句中使用WITH(NOLOCK)(无论如何都应该避免).

我测试了这个并且它会工作,虽然TABLOCK只应该在极端情况下使用.当然,如果需要并发,那么这是一个糟糕的解决方案,需要一些其他形式的锁定.一种方法是更新位列"可用真/假"并仅读取Available = True的行.正如@gbn建议的那样,READPAST 可以用于此.


KM.*_*KM. 5

尝试在事务中使用ROWLOCKUPDLOCK这样的事情:

BEGIN TRANSACTION

SELECT @ID = ID
FROM YourTable WITH (ROWLOCK, UPDLOCK)
WHERE ....

--more--

COMMIT TRANSACTION
Run Code Online (Sandbox Code Playgroud)

但是你不能阻止使用NOLOCK提示的SELECT从"脏"读取它.