You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

MSSQL Server锁升级问询:是否依赖表列数及批量删除锁升级判定

让我来逐个拆解你的两个问题,都是MSSQL Server锁升级里容易混淆的点:

问题1:锁升级到表级别是否取决于表的列数?

答案是完全不依赖

MSSQL Server的锁升级触发逻辑,核心看的是事务在单个表(或分区)上持有的锁数量(默认阈值是5000个),以及锁占用的内存资源,和表的列数没有直接关系。锁是针对行、页、表这类数据资源的,列数只会影响单条数据的大小,但不会成为锁升级的判断依据。

问题2:删除60000行(基于索引查找),是否一定会触发表级锁升级?锁升级依赖行大小吗?

首先明确:不一定会触发表级锁升级,哪怕你删除的行数远超过5000。

锁升级的5000个锁阈值是触发条件,但SQL Server还有几个“例外规则”会阻止升级:

  • 如果你的事务已经持有该表的表级排他锁(X锁),自然不需要再升级,因为已经是最高级别的锁了
  • 如果SQL Server检测到升级锁会引发死锁风险,会暂时跳过这次升级,继续使用行锁或页锁
  • 要是表是分区表,锁计数是按单个分区统计的——如果60000行分散在多个分区里,每个分区的锁数量没超过5000,就不会触发分区级或表级的锁升级

再说说行大小的影响:它不直接决定锁升级,但会间接影响锁的数量。比如行越大,单个数据页能容纳的行数越少,删除同样多行时,需要锁定的页数量可能更少(如果用页锁的话);但如果是行锁,锁的数量就等于删除的行数。不过本质上,锁升级还是看锁的数量阈值,行大小只是通过影响锁的数量间接产生作用,不是锁升级的直接依赖条件。

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

火山引擎 最新活动