Appearance
SQL Server 死锁诊断与会话终止操作指南
💡 说明
当 SQL Server 出现性能停滞、长时间未响应或事务超时异常时,对象级死锁(Object-level Deadlock) 是常见原因之一。本指南提供一套轻量、安全、基于系统视图的诊断与干预流程。
1. 目标与前置条件
- 目标:快速识别参与死锁的表,获取阻塞会话 ID(SPID),并安全终止异常会话。
- 权限:需具备
VIEW SERVER STATE权限,推荐使用sysadmin或db_owner角色。
2. 诊断与处理流程
2.1 步骤一:查询参与死锁的表及会话
执行以下 T-SQL 查询,返回所有当前被以 OBJECT 级别锁定的用户表及会话 ID:
sql
SELECT
OBJECT_NAME(resource_associated_entity_id) AS tableName,
request_session_id AS sessionId,
resource_type,
request_mode,
request_status
FROM sys.dm_tran_locks
WHERE resource_type = 'OBJECT'
AND resource_database_id = DB_ID()
AND OBJECT_NAME(resource_associated_entity_id) IS NOT NULL;2.2 步骤二:确认会话上下文
在 KILL 前建议查看目标会话正在执行的 SQL 文本及阻塞链:
sql
SELECT
r.session_id, r.status, r.command,
t.text AS sql_text,
r.blocking_session_id
FROM sys.dm_exec_requests r
CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) t
WHERE r.session_id = 70; -- 替换为实际 SPID2.3 步骤三:终止异常会话
确认无误后,使用 KILL 命令终止会话:
sql
KILL 70; -- 终止会话 ID 703. ⚠️ 安全注意事项
- 回滚代价:
KILL会强制回滚事务,可能导致业务逻辑中断。 - 禁止 KILL 系统会话:严禁终止
session_id ≤ 50的系统进程。 - 预防优于处置:优化事务访问顺序,开启
READ_COMMITTED_SNAPSHOT以减少锁争用。
🔗 相关资源
