ms sql 检索死锁进程

来源:互联网 发布:国外体育直播软件 编辑:程序博客网 时间:2024/04/30 06:51

锁原理:指在一组进程中的各个进程均占有不会释放的资源,但因互相申请被其他进程所站用不会释放的资源而处于的一种永久等待状态。发生死锁的原因如下:
一种原因是系统提供的资源太少了,远不能满足并发进程对资源的需求。这种竞争资源引起的死锁是我们要讨论的核心。例如:消息是一种临时性资源。某一时刻,进程A等待进程B发来的消息,进程B等待进程C发来的消息,而进程C又等待进程A发来的消息。消息未到,A,B,C三个进程均无法向前推进,也会发生进程通信上的死锁。
另一种原因是由于进程推进顺序不合适引发的死锁。资源少也未必一定产生死锁。就如同两个人过独木桥,如果两个人都要先过,在独木桥上僵持不肯后退,必然会应竞争资源产生死锁;但是,如果两个人上桥前先看一看有无对方的人在桥上,当无对方的人在桥上时自己才上桥,那麽问题就解决了。所以,如果程序设计得不合理,造成进程推进的顺序不当,也会出现死锁.
在sql中,所以线程信息保存在Master.dbo.SysProcesses表中,下面是该表字段的定义:

Column name Description
spid SQL的线程ID.
kpid Microsoft Windows NT 4.0® thread ID.
blocked 阻塞当前线程的线程ID
waittype 保留.
waittime 等待时间(ms),waittime=0表不在等待
lastwaittype 最后或当前等待类型
waitresource Textual representation of a lock resource.
dbid 数据库ID (db_name(dbid)获取数据库名称)
uid 运行当前命令的用户ID
cpu 进程的累计CPU时间
physical_io 累计读写次数
memusage 当前程序缓存被进程分配的页数,当值为负数表示 自由分配.
login_time 客户端登录进服务器的时间点,对于系统进程,存储的是服务器开启的时间点.
last_batch 最后一次客户端执行命令的时间点,对于系统进行,存储的是服务器开启的时间点.
ecid 执行上下文ID 用于标志子线程作为一个单独的进程.
open_tran 打开事务数
status 进程状态 (running, sleeping, and so on).
sid 用户的唯一识别码
hostname 工作站名称(发送请求电脑名称)
program_name 请求程序名称
hostprocess 工作站进程ID( 发送请求电脑进程ID)
cmd 当前被执行的指令.
nt_domain 客户端 的域名(假如用window验证)
nt_username 进程的域 用户名称(假如用window验证)
net_address 网卡地址
net_library 网络协议:TCP/IP Sockets;Named Pipes;
NWLink IPX/SPX…
loginame 登录人名称

死锁判定的方法是:阻塞ID(blocked 字段)不为0,该ID对应的线程就判定是造成死锁的线程,当前ID判断为被阻塞线程.

我常用如下命令进行查询死锁的进程:

select spid, blocked, loginame, last_batch, status, cmd, hostname, program_namefrom sysprocesseswhere spid in ( select blocked from sysprocesses where blocked <> 0 ) or (blocked <>0)


原创粉丝点击