You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL Server中Update操作为何立即产生表锁?

为什么SQL Server执行UPDATE TOP(1)时会出现OBJECT级锁?

核心误解:你看到的不是表级排他锁,是意向排他锁(IX)

你混淆了锁升级后的表级排他锁(X)和意向排他锁(IX)。SQL Server的锁是分层级的(表→页→行),当你要对行加排他锁(X)时,必须先在表和页层级加意向排他锁(IX),这是锁机制的正常行为,不是锁升级。

意向锁的作用

意向锁的核心目的是:

  • 告知其他事务:当前表/页内已有事务持有行级锁,或准备持有行级锁
  • 避免其他事务直接申请表级排他锁(X)——因为IX锁和表级X锁冲突,既能防止全表被意外锁死,又不影响其他事务操作表内的其他行

锁升级的触发条件

锁升级只会在一个事务持有超过5000个行/页锁(默认阈值)时才会触发,将这些锁升级为表级X锁。你这里只更新1行,完全达不到锁升级的条件,所以不存在“立即获取表锁”的情况。

你的测试结果拆解

从sys.dm_tran_locks的结果来看:

  • RID类型的X锁:你更新的目标行的排他锁,符合预期
  • PAGE类型的IX锁:目标行所在数据页的意向排他锁
  • OBJECT类型的IX锁:表级的意向排他锁,这是锁层级的必要前置锁,不是锁升级

验证方法

你可以在另一个会话执行以下语句,尝试更新其他行:

UPDATE dbo.lockTest SET IsActive = 1 WHERE ID = 2

会发现这个语句可以正常执行——如果是锁升级后的表级X锁,这个语句会被阻塞。这也能证明你看到的OBJECT锁只是意向锁,不是排他表锁。


内容的提问来源于stack exchange,提问作者cgoll

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 08:07:33