事务中的SQL Server锁提示

时间:2018-02-21 05:38:08

标签: sql-server

在SQL Server 2014中,如果我在事务中有一个像这样指定的锁定提示,那么表UserTableA是否会为整个事务锁定,还是仅针对select查询?

BEGIN TRAN T1

SELECT Col1, Col2
FROM UserTableA
WITH (XLOCK, ROWLOCK)
WHERE Col1 = @Value

-- Do some work

COMMIT TRAN T1

1 个答案:

答案 0 :(得分:2)

  

将为整个交易锁定表UserTableA,或   仅适用于选择查询?

X-lock将被占用,直到交易完成

Yuo可以在BOL中阅读: Hints (Transact-SQL) - Table

  

XLOCK

     

指定在事务完成之前使用并保持独占锁。如果使用ROWLOCK,PAGLOCK指定,   或TABLOCK,独占锁适用于适当的级别   粒度

这是因为在事务完成之前总是保持exclusive锁,这与transaction isolation level无关。

其他评论建议使用HOLDLOCK,即使用serializable TIL,在获取共享锁时可能会有意义,但事实并非如此,您的提示意味着您需要{ {1}}。

你可以在我的小型repro中轻松看到它,我使用exclusive lockheap表进行了2次重复,如果整个表格中clustered heap是如果X-lock上的clustered table X-lock以及keyIX上有两个page锁,则会举行:

集群:

enter image description here

堆:

enter image description here