有你在真好 的个人博客
MSSQL 进程的阻塞与死锁检查
阅读:2328 添加日期:2021/3/27 23:27:52 原文链接:https://www.toutiao.com/item/6341896367996142081/

[master].[sys].[sysprocesses] 系统表是一个很重要的系统视图,主要用来定位与解决 sql server 的阻塞与死锁。这个表查询出的内容包含正在 sql server 实例上运行的进程的相关信息。这些进程可以是客户端进程或系统进程。

视图中的主要字段

字段说明
spidSql Server 会话ID
kpidWindows 线程ID
blocked正在阻塞请求的会话ID。如果此列为Null,则标识请求未被阻塞
waittype当前连接的等待资源编号,标识是否等待资源,0或Null表示不需要等待任何资源
watitime当前等待时间,单位为毫秒,0表示没有等待
dbid当前正由进程使用的数据库ID
uid执行命令的用户ID
login_time客户端进程登录到服务器的时间
last_batch上次执行存储过程或Execute语句的时间。对于系统进程,将存储sql server的启动时间
open_tran进程的打开事物个数。如果有嵌套事物,就会大于1
status进程ID状态
hostname建立链接的客户端工作站的名称
program_name应用程序的名称,就是连接字符串中配的 Application Name
hostprocess建立连接的应用程序在客户端工作站的进程ID号
cmd当前正在执行的命令
loginname登录名

status:进程ID 状态

  • dormant = 正在重置会话 ; . running = 会话正在运行一个或多个批处理 ;

  • background = 会话正在运行一个后台任务 ; . rollback = 会话正在处理事务回滚 ;

  • pending = 会话正在等待工作线程变为可用 ; . runnable = 会话中的任务在等待获取 Scheduler 来运行的可执行队列中 ;

  • spinloop = 会话中的任务正在等待调节锁变为可用 ; . suspended = 会话正在等待事件完成

应用实例

  • 先找到哪个链接的 blocked 字段不为 0。如 spid 53 的 blocked 字段是 52,spid 52 的 bloecked 为 0,就可以得出结论:此时有阻塞发生,53 被 52 阻塞了。如果你发现一个连接的 blocked 字段等于自己,那说明这个连接正在做磁盘读写,要等它自己的 I/O 做完。

  • 查找链接在哪个数据库上

  • 检查 dbid 即可,得到 dbid,可以运行一下查询得到数据库的名字:SELECT * FROM [master].[sys].[sysdatabases]。

ICP备案号:苏ICP备14035786号-1 苏公网安备 32050502001014号