假设我有一个未指定事务 block 和默认事务隔离级别的存储过程,它执行以下操作:
SELECT [something] FROM myTable WITH (UPDLOCK)
SELECT [something else] FROM myTable
IF (condition) INSERT INTO myTable VALUES [stuff]
UPDLOCK 实际上是如何工作的?更新锁也会扩展到第二个选择吗?如果同时多次调用SP,没有告诉hint覆盖全表,这里会不会有死锁的可能?
我已经阅读了联机文档,但我承认我迷失了尝试将资源范围和锁定模式放在一起的尝试。一个明确的解释将不胜感激。
最佳答案
锁的生命周期没有完整的记录。获取、释放和持有锁以提供所请求隔离级别的 promise 。 Strict 2 phase locking有时会服从,但你不能依赖它。锁定生命周期受计划选择和其他因素(例如资源利用率)的影响。
一般认为,S 和 U 锁会“在必要时”持有(这意味着什么取决于查询计划),而 X 锁会一直持有到事务结束。
与其向我们提出一个抽象的存储引擎实现细节问题,不如向我们提出您要解决的实际问题。无法从您的问题中判断出您要解决什么问题。也许应用锁会更好用。也许需要可序列化的事务。
关于sql-server - 什么是表提示锁的范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20192889/