SQL Server 查询死锁以及解决死锁的基本知识(图文)

1. 基本知识
在 SQL Server 中,死锁是指两个或多个进程互相等待对方持有的资源,从而无法继续执行的现象

要解决死锁问题,首先需要识别并分析死锁的发生原因,然后采取相应的措施来预防和处理死锁

识别死锁的常用方法有以下几种:

使用 SQL Server Profiler:可以捕获死锁事件,生成死锁图
使用 Extended Events:更轻量级,适用于生产环境
启用死锁跟踪标志:可以使用 DBCC TRACEON 命令启用死锁跟踪标志(如 1222 或 1204),以记录死锁信息到 SQL Server 错误日志中

-- 启用死锁跟踪标志
DBCC TRACEON (1222, -1);
DBCC TRACEON (1204, -1);

-- 关闭死锁跟踪标志
DBCC TRACEOFF (1222, -1);
DBCC TRACEOFF (1204, -1);

查看系统健康报告:SQL Server 2016 及更高版本提供的系统健康报告可以捕获和记录死锁事件

可以使用以下查询查看当前活动的进程:

-- 查看活动的进程
SELECT
session_id,
blocking_session_id,
wait_type,
wait_time,
wait_resource,
last_wait_type,
status,
command,
sql_handle,
statement_start_offset,
statement_end_offset,
plan_handle,
database_id,
user_id,
cpu_time,
reads,
writes,
logical_reads,
row_count
FROM
sys.dm_exec_requests;

截图如下:

杀死特定进程

一旦确定了要终止的会话ID,可以使用以下命令终止该进程:

KILL <session_id>; -- 替换为实际的会话ID

2. 查看和解锁被锁的表

查看被锁的表
要查看当前被锁的表,可以使用以下查询:

SELECT
request_session_id AS spid,
OBJECT_NAME(resource_associated_entity_id) AS tableName
FROM
sys.dm_tran_locks
WHERE
resource_type = 'OBJECT';

截图如下所示:

解锁被锁表:

DECLARE @spid INT;
SET @spid = 88; -- 替换为要终止的会话ID

DECLARE @sql VARCHAR(1000);
SET @sql = 'KILL ' + CAST(@spid AS VARCHAR);
EXEC(@sql);

3. 查看和处理数据库堵塞

查看数据库是否堵塞
要查看数据库中的堵塞情况,可以使用以下查询:

SELECT *
FROM sys.sysprocesses
WHERE blocked <> 0;

截图如下:

这个查询会返回所有被阻塞的进程,blocked 列表示当前进程被哪个进程阻塞

根据ID查找对应的SQL进程
要查看特定会话正在执行的SQL语句,可以使用以下命令:(显示指定会话正在执行的最后一条SQL语句)

DBCC INPUTBUFFER(110); -- 替换为实际的会话ID

 

版权声明:
作者:SE_Meng
链接:https://www.cnesa.cn/1895.html
来源:CNESA
文章版权归作者所有,未经允许请勿转载。

THE END
打赏
海报
SQL Server 查询死锁以及解决死锁的基本知识(图文)
1. 基本知识 在 SQL Server 中,死锁是指两个或多个进程互相等待对方持有的资源,从而无法继续执行的现象 要解决死锁问题,首先需要识别并分析死锁的发生原因……
<<上一篇
下一篇>>