快速定位MS Sql Server 数据库死锁进程

最近在做一个大型项目,由于数据设计采用离散型数据库设计,以方便需求变更及用户自定义流程要素,因为要素用户自定义,数据完整性靠代码约束变得不太现实,只能依靠表间关系来约束,结果因此导致数据的操作经常产生X(排它)锁,严重影响数据性能。

对于一时没有更好解决方法的数据库死锁最直接的解决办法是杀死生成死锁的数据库进程。

如果有死锁产生,下面的代码运行后可以看到大量死锁信息在同一进程(SPID)上,可以根据情况杀死(Kill)某进程。

 

select p.spid
,p.[dbid]
,db_name(p.[dbid]) [db_name]
,l.rsc_objid As [ObjId]
,object_name(l.rsc_objid) [object_name]
,l.rsc_indid As IndId
,v.name As [Type]
,u.name As Mode
,x.name As [Status]
,l.req_transactionID [Transaction]
,p.cmd
,p.hostname
,p.program_name
,p.last_batch
,p.open_tran
,l.rsc_text as [Resource]
--,p.*
from master.dbo.syslockinfo(NOLOCK) l
inner join master.sys.sysprocesses(NOLOCK) p
on l.req_spid = p.spid
inner join master.dbo.spt_values(NOLOCK) v
ON l.rsc_type = v.number
inner join master.dbo.spt_values(NOLOCK) x
on l.req_status = x.number
inner join master.dbo.spt_values(NOLOCK) u
ON l.req_mode + 1 = u.number
where
v.type = ‘LR‘
and x.type = ‘LS‘
and u.type = ‘L‘
order by p.spid

-- kill 91

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。