Sql server 事务内的SQL Server锁提示
在SQL Server 2014中,如果在事务中指定了这样的锁定提示,那么表Sql server 事务内的SQL Server锁提示,sql-server,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 整个事务是否会锁定表UserTableA,或者 仅适用于select查询 BEGIN TRAN T1
UserTableA
是针对整个事务锁定,还是仅针对select查询锁定
BEGIN TRAN T1
SELECT Col1, Col2
FROM UserTableA
WITH (XLOCK, ROWLOCK)
WHERE Col1 = @Value
-- Do some work
COMMIT TRAN T1
整个事务是否会锁定表UserTableA,或者
仅适用于select查询
BEGIN TRAN T1
SELECT Col1, Col2
FROM UserTableA
WITH (XLOCK, ROWLOCK)
WHERE Col1 = @Value
-- Do some work
COMMIT TRAN T1
X锁
将被获取并保持,直到事务完成
Yuo可以在BOL中阅读:
XLOCK
指定在事务完成之前获取并保持独占锁。如果使用ROWLOCK、PAGLOCK指定,
或TABLOCK,专用锁应用于适当级别的
粒度
这是因为独占的
锁始终保持到事务完成,这与事务隔离级别
无关
其他评论建议使用HOLDLOCK
,即使用serializable TIL
,在使用共享锁时可能有意义,但这不是您的情况,您的提示意味着您需要独占锁
你可以很容易地在我的小复制中看到它,我使用堆
和集群
表进行了2次复制,在堆
的情况下,整个表上的X锁,如果在键上有聚集表
X锁
,在页面上有两个IX锁
和键
,则:
群集:
堆:
整个事务是否会锁定表UserTableA,或者
仅适用于select查询
BEGIN TRAN T1
SELECT Col1, Col2
FROM UserTableA
WITH (XLOCK, ROWLOCK)
WHERE Col1 = @Value
-- Do some work
COMMIT TRAN T1
X锁
将被获取并保持,直到事务完成
Yuo可以在BOL中阅读:
XLOCK
指定在事务完成之前获取并保持独占锁。如果使用ROWLOCK、PAGLOCK指定,
或TABLOCK,专用锁应用于适当级别的
粒度
这是因为独占的
锁始终保持到事务完成,这与事务隔离级别
无关
其他评论建议使用HOLDLOCK
,即使用serializable TIL
,在使用共享锁时可能有意义,但这不是您的情况,您的提示意味着您需要独占锁
你可以很容易地在我的小复制中看到它,我使用堆
和集群
表进行了2次复制,在堆
的情况下,整个表上的X锁
,如果在键上有聚集表
X锁
,在页面上有两个IX锁
和键
,则:
群集:
堆:
如果您有XLOCK
和ROWLOCK
,它将仅针对该语句被锁定。如果要挂起锁,请指定HOLDLOCK
,即使该语句位于事务内部,是否正确?因此,在这种情况下,如果SELECT语句不在事务范围内,它将以相同的方式工作。如果您有XLOCK
和ROWLOCK
,它将仅针对该单个语句被锁定。如果要挂起锁,请指定HOLDLOCK
,即使该语句位于事务内部,是否正确?因此,在这种情况下,如果SELECT语句在事务之外,它将以相同的方式工作,对吗?