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 可以用于此.
尝试在事务中使用ROWLOCK和UPDLOCK这样的事情:
BEGIN TRANSACTION
SELECT @ID = ID
FROM YourTable WITH (ROWLOCK, UPDLOCK)
WHERE ....
--more--
COMMIT TRANSACTION
Run Code Online (Sandbox Code Playgroud)
但是你不能阻止使用NOLOCK提示的SELECT从"脏"读取它.