Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 事务内的SQL Server锁提示_Sql Server - Fatal编程技术网

Sql server 事务内的SQL Server锁提示

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

在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

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语句在事务之外,它将以相同的方式工作,对吗?