代码之家  ›  专栏  ›  技术社区  ›  Shivprasad Koirala

为什么共享锁允许在SQL Server中更新?[复制品]

  •  1
  • Shivprasad Koirala  · 技术社区  · 6 年前

    这个问题已经有了答案:

    当我们发出一条SELECT语句时,它会放置一个共享锁,并且在共享锁期间,其他事务不能进行更新。因此,我尝试按照下面的代码进行以下操作。

    我已经启动了一个事务,然后延迟50秒。我打开其他查询窗口并尝试更新同一记录。我原以为更新应该被阻塞50秒,但它只是执行而已。 在释放select shared lock之后,我将以任何方式进入wait shared模式。

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

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

    2 回复  |  直到 6 年前
        1
  •  2
  •   PSK    6 年前

    在执行select之后,即使它在事务中,也会立即释放共享锁。

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

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

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

        2
  •  0
  •   Thailo    6 年前

    这种行为源于 SELECT 事务隔离级别。默认情况下,SQL Server使用read committed作为事务隔离级别,在该级别中可以立即获取和释放共享锁。如果要对所选内容使用独占锁,则需要使用事务级可序列化。