代码之家  ›  专栏  ›  技术社区  ›  Developer Webs

SQL Server:Tablock,在选择之前还是之后锁定?

  •  2
  • Developer Webs  · 技术社区  · 6 年前

    在下面的示例中,当使用 with (tablockx) 锁定是在选择确定最大值之前还是之后完成的?是否存在将insert语句插入表“table1”的竞争条件,或者是否保证@foo将包含在表中找到的最大值,直到提交或回滚事务?

    begin Transaction
    
    declare @foo int = (select max(col1) from table1 with (tablockx))
    -- Is it possible that max(col1) can be > @foo here?
    
    Commit Transaction
    

    如果重要的话,我使用的是SQLServer2008R2

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

    锁定是否在选择确定最大值之前完成,或 之后

    在表中插入insert语句时是否存在竞争条件

    没有,因为您正在使用 TABLOCKX 不仅仅是 TABLOCK TABLOCKX .

    是否保证@foo将包含在 表,直到提交或回滚事务

    是的,所有其他事务都将被阻止(删除、插入、更新等)

    测试

    create table t1_delete (col1 int)
    insert into t1_delete
    values (1)
    go
    

    COMMIT TRAN

    begin Transaction
    
    declare @foo int = (select max(col1) from t1_delete with (tablockx))
    -- Is it possible that max(col1) can be > @foo here?
    select @foo
    --Commit Transaction
    

    现在,在一个 尝试插入一个新值,或其他任何内容

    insert into t1_delete
    values(2)
    

    您将注意到查询旋转。如果你跑步,你就会明白为什么 exec sp_whoIsActive Adam Mechanic 在里面 另一个查询窗口 blocking_session_id 用于插入会话。这将是一次与 sql_test 喜欢 开始事务声明@foo。。。 .

        2
  •  2
  •   Jeffrey Van Laethem    6 年前

    Tablockx将获取事务提交或回滚时释放的独占锁。因此,您的评论区域将被阻止。