0


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

目录

1. 基本知识

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

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

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

  • 使用 SQL Server Profiler:可以捕获死锁事件,生成死锁图
  • 使用 Extended Events:更轻量级,适用于生产环境
  • 启用死锁跟踪标志:可以使用 DBCC TRACEON 命令启用死锁跟踪标志(如 1222 或 1204),以记录死锁信息到 SQL Server 错误日志中
  1. -- 启用死锁跟踪标志DBCC TRACEON (1222,-1);DBCC TRACEON (1204,-1);-- 关闭死锁跟踪标志DBCC TRACEOFF (1222,-1);DBCC TRACEOFF (1204,-1);
  • 查看系统健康报告:SQL Server 2016 及更高版本提供的系统健康报告可以捕获和记录死锁事件

在这里插入图片描述

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

  1. -- 查看活动的进程SELECT
  2. session_id,
  3. blocking_session_id,
  4. wait_type,
  5. wait_time,
  6. wait_resource,
  7. last_wait_type,status,
  8. command,
  9. sql_handle,
  10. statement_start_offset,
  11. statement_end_offset,
  12. plan_handle,
  13. database_id,
  14. user_id,
  15. cpu_time,reads,
  16. writes,
  17. logical_reads,
  18. row_count
  19. FROM
  20. sys.dm_exec_requests;

截图如下:

在这里插入图片描述

杀死特定进程

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

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

2. 查看和解锁被锁的表

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

  1. SELECT
  2. request_session_id AS spid,
  3. OBJECT_NAME(resource_associated_entity_id)AS tableName
  4. FROM
  5. sys.dm_tran_locks
  6. WHERE
  7. resource_type ='OBJECT';

截图如下所示:

在这里插入图片描述

解锁被锁表:

  1. DECLARE@spidINT;SET@spid=88;-- 替换为要终止的会话IDDECLARE@sqlVARCHAR(1000);SET@sql='KILL '+ CAST(@spidASVARCHAR);EXEC(@sql);

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

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

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

截图如下:

在这里插入图片描述

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

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

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

本文转载自: https://blog.csdn.net/weixin_47872288/article/details/140110615
版权归原作者 码农研究僧 所有, 如有侵权,请联系我们删除。

“SQL Server 查询死锁以及解决死锁的基本知识(图文)”的评论:

还没有评论