sql-server - 什么是表提示锁的范围?

标签 sql-server tsql scope locking

假设我有一个未指定事务 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/

相关文章:

sql - 将行插入仅包含一个 IDENTITY 列的表中

sql-server - 我需要根据时间从表中选择数据。但是我的表字段是日期时间

sql - 如何在 SQL Server 查询中连接文本?

sql - 查询每个人最近参加的事件

TSQL 合并日期字段和时间字段

c++ - 指针、类项和范围

sql-server - 自连接数据到分层 XML

sql - 有没有一种方法可以在一个查询中查询 135 个不同的表?

javascript - AngularJS 未定义函数

Python eval(compile(...), sandbox),除非在 def 中,否则全局变量进入沙箱,为什么?