加入收藏 | 设为首页 | 会员中心 | 我要投稿 宁德站长网 (https://www.0593zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

sql-server – 带UPDLOCK的HOLDLOCK

发布时间:2021-03-05 17:24:09 所属栏目:MsSql教程 来源:网络整理
导读:它在事务中使用HOLDLOCK或UPDLOCK(比如说T1),不会阻止来自另一个事务(比如T2)的读访问. 据我了解,在T1完成之前,HOLDLOCK将阻止T2更新/删除;并且UPDLOCK将阻止T2的更新/删除/插入.在这两个T2中都将具有对这些记录的读访问权. 但是,使用两者(如:HOLDLOCK,UP

它在事务中使用HOLDLOCK或UPDLOCK(比如说T1),不会阻止来自另一个事务(比如T2)的读访问.

据我了解,在T1完成之前,HOLDLOCK将阻止T2更新/删除;并且UPDLOCK将阻止T2的更新/删除/插入.在这两个T2中都将具有对这些记录的读访问权.

但是,使用两者(如:HOLDLOCK,UPDLOCK)甚至可以阻止T2进行读取访问.当我们使用它们时到底发生了什么?

感谢您的见解

更新:

这不是我所看到的:

例如:

在查询1中:

begin tran

select * from tblTest WITH (UPDLOCK,HOLDLOCK)

WAITFOR DELAY '00:00:10'

commit tran

在查询2中:

select * from tblTest

在查询1完成之前,查询2不会产生结果.

解决方法

UPDLOCK影响锁的类型.这意味着对于SELECT语句,将采用U锁而不是S锁.在默认的读取提交级别,它们将在读取数据后立即释放.

以上适用于行和页锁.对于表级锁定BOL状态

If UPDLOCK is combined with TABLOCK,or a table-level lock is taken
for some other reason,an exclusive (X) lock will be taken instead.

HOLDLOCK意味着您获得了可序列化的隔离语义,因此在事务结束之前锁定不会被释放,并且至少会锁定查询所涵盖的整个范围以防止插入幻像.

U锁与其他S锁兼容,但不与其他U锁兼容(参见Lock compatibility matrix),因此如果锁在行或页面级别取出,除非他们也使用UPDLOCK提示,否则不会阻止其他读取器.

如果由于UPDLOCK而取出对象级别X锁定,则读取器将被阻止尝试获取表格上的IS锁定.在您的示例查询中,尝试查看sys.dm_tran_locks,同时阻止第二个查询以查看两个事务都有/等待的锁.

对于您的问题中的查询

SELECT *
FROM   tblTest WITH (UPDLOCK,HOLDLOCK)

如果查询计划在堆上显示扫描,则始终会在对象上获得X锁定.如果是索引扫描,则取决于所使用的锁定粒度(通常在执行at least 5,000较低级别锁定后尝试锁定升级到表级别).

(编辑:宁德站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读