SQL Server 查看和解除表锁的常用方法
SQL Server 运行时常遇表锁定导致查询阻塞。本文介绍利用 sys.dm_tran_locks 等视图定位占用表的会话(spid),并通过 Kill 命令终止特定进程以快速解除表锁的操作方法。
为什么需要手动解锁?
在关系型数据库中,事务执行期间若持有排他锁且未提交或回滚,会导致其他请求该数据的进程挂起。虽然最佳实践是优化事务逻辑、缩短事务持有时间或降低隔离级别,但在排查线上故障时,识别并终止异常的长驻锁是恢复服务可用的有效手段。
查看被锁表的方法
要找到“谁锁了哪张表”,通常关注发起锁请求的会话 ID (request_session_id) 以及目标对象名称。
第 1 步:查询当前持有 OBJECT 级锁的对象
目的:直接列出当前正在对表对象加锁的会话 ID 及表名。
入口:SSMS 查询窗口或客户端连接。
参数:筛选 resource_type='OBJECT'。
完成状态:结果集中包含 spid (即 request_session_id) 和 tableName。
select request_session_id as spid,
OBJECT_NAME(resource_associated_entity_id) as tableName
from sys.dm_tran_locks
where resource_type = 'OBJECT'
其中:
spid:锁表的进程 ID。
tableName:被锁定的表名。
第 2 步:排除自身并指定数据库
目的:针对特定业务库,过滤掉当前查询所在的上下文会话。
入口:SSMS 查询窗口。
重要参数:将 '数据库名称' 替换为实际库名。
完成状态:返回非本会话且在指定库内产生等待/锁的进程列表。
select spId
from master..SysProcesses
where db_Name(dbID) = '数据库名称'
and spId <> @@SpId
and dbID <> 0
解除(Kill)表锁的操作
锁定源于某个具体的 Session。一旦确认了异常连接的 spid,可以通过终结该会话来强制释放其持有的锁。请注意:此操作会中断该客户端的连接,正在进行的任何事务都将回滚。
第 3 步:构造并执行 Kill 命令
目的:向 SQL Server 发送终止进程指令。
入口:新的查询窗口(切勿在被锁的同一个连接中执行)。
参数:将 @spid 设置为上一步获取到的具体进程号(如 57)。
风险提示:操作前请评估是否影响关键业务。
declare @spid int
Set @spid = 57 -- 替换为实际的锁表进程号
-- 动态构建 Kill 字符串
set @sql = 'kill ' + cast(@spid as varchar(10))
exec(@sql)
对于部分环境也支持直接在查询中使用 EXEC ('Kill '+cast(@spid as varchar)) 的形式,但显式声明变量方式更易控制类型转换。
以上就是 SQL Server 查看和解除表锁的详细内容,更多关于 SQL Server 性能调优的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









