MSSQL 进程的阻塞与死锁检查
[master].[sys].[sysprocesses] 系统表是一个很重要的系统视图,主要用来定位与解决 sql server 的阻塞与死锁。这个表查询出的内容包含正在 sql server 实例上运行的进程的相关信息。这些进程可以是客户端进程或系统进程。
视图中的主要字段
字段 | 说明 |
---|---|
spid | Sql Server 会话ID |
kpid | Windows 线程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]。
