SQL事务锁查询异常:无WHERE子句时Sch-S锁并非每次可见
问题成因分析
这个现象的核心原因是架构稳定性锁(Sch-S)的短生命周期特性,以及两种查询的执行效率差异导致的锁捕获时机不同:
Sch-S锁的本质
Sch-S锁是SQL Server在访问对象元数据时自动获取的轻量级锁,作用是防止查询执行期间对象元数据被修改。它的生命周期极短,仅在元数据验证/解析阶段持有,一旦该阶段完成就会立即释放,不会持续到整个查询执行结束。无WHERE子句查询的执行特性
你最初的查询需要扫描sys.dm_tran_locks中所有会话的锁记录,还要关联sys.objects、sys.dm_exec_sessions两个系统视图,执行步骤多、耗时相对较长。当查询执行到读取锁信息的阶段时,自身获取的sysschobjs表Sch-S锁已经完成使命被释放,自然就无法在结果中看到它。带WHERE子句查询的执行特性
添加WHERE l.request_session_id = @@SPID后,查询仅过滤当前会话的锁记录,执行路径大幅缩短、速度极快。在查询读取锁信息的瞬间,自身的Sch-S锁还处于持有状态(元数据相关操作还没完全结束),因此每次都能捕获到这条锁记录。补充说明
类似的现象会出现在所有需要访问元数据的轻量级锁场景中,锁的释放时机和查询的执行效率直接决定了是否能被自身查询捕获到。
内容的提问来源于stack exchange,提问作者Foreastbtch
相关产品推荐
相关产品推荐

