sql-server – 带UPDLOCK的HOLDLOCK
它在事宜中行使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状态
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较初级别锁定后实行锁定进级到表级别). (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |