首页 > 解决方案 > 为什么共享锁允许在 SQL Server 中进行更新?

问题描述

当我们发出一个 select 语句时,它会放置一个共享锁,并且在共享锁期间其他事务无法进行更新。所以我正在尝试执行以下操作,如下面的代码所示。

我已经开始交易,然后延迟 50 秒。我打开其他查询窗口并尝试对同一记录进行更新。我期待更新应该被阻止 50 秒,但它只是执行。是不是在选择共享锁被释放后,我以任何方式进入等待共享模式。

begin tran
select * from tblCustomer where CustomerId=1
WAITFOR DELAY '00:00:50'
commit tran

当我这样做以进行更新时,它可以工作。我的意思是当我将更新放入 begin tran 和 committ tran 并在提交模式下执行 select 时,选择块。

标签: sql-server

解决方案


您的共享锁在选择执行后立即释放,即使它在事务内部。

如果您打算在选择后更新记录,在这种情况下,您需要获取UPDLOCK如下锁。

DECLARE @IdToUpdate INT
SELECT @IdToUpdate = ID from tblCustomer WITH (UPDLOCK) where CustomerId=1  
UPDATE [tblCustomer]
SET X=Y
WHERE ID=@IdToUpdate

这将提前在记录上获取必要的更新锁,并将停止其他会话以获取记录上的任何锁(共享/独占)


推荐阅读