小编典典

如何排他地锁定行以防止CRUD操作

sql

我如何在SQL Server中锁定行,以防止CRUD操作(甚至是SELECT)。是否有可能?可序列化的隔离级别不会阻止SELECT。谢谢


阅读 148

收藏
2021-03-23

共1个答案

小编典典

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 _可以_与此一起使用。

2021-03-23