什么是表提示锁的范围?

假设我有一个没有指定事务块的存储过程,并且有一个默认的事务隔离级别,它的作用如下:

SELECT [something] FROM myTable WITH (UPDLOCK)
SELECT [something else] FROM myTable
IF (condition) INSERT INTO myTable VALUES [stuff]

UPDLOCK实际上如何工作? 更新锁定是否会延伸到第二个选择? 如果SP在同一时间被多次调用并且提示未被告知覆盖整个表格,那么在这里是否存在可能的死锁?

我已经阅读了在线文档,但我承认我迷失了尝试将资源范围和锁定模式放在一起。 一个明确的解释将非常感激。


一旦锁定在对象上,它将一直保持到事务结束(显式或隐式)。 如果您将两条语句放在一个事务中,则第一条中使用的锁将在第二条中生效。

这同样适用于在一个事务中多次调用存储过程。 来自每次通话的锁定将保持到交易结束。 (事务隔离级别在存储过程结束时恢复,但不是锁本身)。


锁的寿命没有完全记录。 获取,释放和保存锁以提供所请求的隔离级别的许诺。 有时会遵守严格的2阶段锁定,但是你不能依赖它。 锁定寿命受计划选择和其他因素(例如资源利用率)的影响。

普遍的看法是,只要需要,S和U锁就会被保留(这意味着取决于查询计划),并且X锁一直保存到事务结束。

而不是向我们展示一个抽象的存储引擎实现细节问题,而不是提出你正在尝试解决的实际问题。 从你的问题中不可能知道你想要解决什么问题。 也许应用程序锁定会更好。 也许需要序列化交易。


本着教导一个人钓鱼的精神,你可以看看sys.dm_tran_locks和sys.dm_tran_session_transactions,看看你的会话在不同阶段持有哪些锁。 或者,您可以设置一个扩展事件会话来捕获lock_acquired,lock_released,以及类似sql_statement_completed(当然仅限于您的会话ID,因此输出不是压倒性的)。

链接地址: http://www.djcxy.com/p/32843.html

上一篇: What is a scope of a table hint lock?

下一篇: Does with(updlock) reduce deadlocks in select queries?