在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
答案 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 lock
和heap
表进行了2次重复,如果整个表格中clustered
heap
是如果X-lock
上的clustered table
X-lock
以及key
和IX
上有两个page
锁,则会举行:
集群:
堆: