Skip to content

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; -- 替换为实际 SPID

2.3 步骤三:终止异常会话 ​

确认无误后,使用 KILL 命令终止会话:

sql
KILL 70; -- 终止会话 ID 70

3. ⚠️ 安全注意事项 ​

  • 回滚代价:KILL 会强制回滚事务,可能导致业务逻辑中断。
  • 禁止 KILL 系统会话:严禁终止 session_id ≤ 50 的系统进程。
  • 预防优于处置:优化事务访问顺序,开启 READ_COMMITTED_SNAPSHOT 以减少锁争用。

🔗 相关资源

方舟 · Ark