表提示锁的范围是什么?

时间:2013-11-25 12:17:34

标签: sql-server tsql scope locking

假设我有一个没有指定事务块的存储过程和一个默认事务隔离级别,它执行以下操作:

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

UPDLOCK实际上如何运作?更新锁是否也会扩展到第二个选择?如果同时多次调用SP并且没有告知覆盖整个表格,是否存在死锁的可能性?

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

3 个答案:

答案 0 :(得分:3)

锁定寿命尚未完整记录。获取,释放和保持锁定以提供所请求的隔离级别的承诺。 Strict 2 phase locking有时会被遵守,但你不能依赖它。锁定寿命受到计划选择和其他因素(例如资源利用率)的影响。

一般认为,只要有必要,就会保留S和U锁(这意味着取决于查询计划),并且X锁一直保持到交易结束。

不是向我们提出抽象存储引擎实现细节问题,而是提出您尝试解决的实际问题要好得多。从你的问题中无法判断你想要解决的是什么。也许app锁会更好用。也许需要可序列化的交易。

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

本着教导钓鱼的精神,您可以查看sys.dm_tran_locks和sys.dm_tran_session_transactions,了解您的会话在不同阶段持有的锁。或者,您可以设置一个扩展事件会话,捕获lock_acquired,lock_released以及sql_statement_completed(当然,仅限于您的会话ID,因此输出不会太大)。

相关问题