我如何在SQL Server中锁定行,以防止CRUD操作(甚至是SELECT)。是否有可能?可序列化的隔离级别不会阻止SELECT。谢谢
BEGIN TRAN
SELECT 1 FROM Table WITH (XLOCK, ROWLOCK) COMMIT TRAN
这样就可以了。
编辑
正如其他人所指出的,您不能将行锁定为不被读取 。我知道这样做的唯一方法如下:
WITH (UPDLOCK, TABLOCK)
并假设在SELECT语句中从未使用过WITH(NOLOCK)(无论如何应避免使用)。
我测试了这一点,并且可以正常工作,尽管TABLOCK仅应在极端情况下使用。当然,如果需要并发,那将是一个糟糕的解决方案,并且将需要某种其他形式的锁定。一种方法是更新位列“ Available True / False”,并且仅读取“ Available = True”的行。正如@gbn所建议的,READPAST _可以_与此一起使用。