2.代码
create proc [dbo].[p_lockinfo]@kill_lock_spID bit=1,--是否杀掉死锁的进程,1 杀掉,0 仅显示@show_spID_if_nolock bit=1 --如果没有死锁的进程,是否显示正常进程信息,1 显示,0 不显示asdeclare @count int,@s nvarchar(1000),@i intselect ID=IDentity(int,1,1),标志,进程ID=spID,线程ID=kpID,块进程ID=blocked,数据库ID=dbID,数据库名=db_name(dbID),用户ID=uID,用户名=loginame,累计cpu时间=cpu,登陆时间=login_time,打开事务数=open_tran,进程状态=status,工作站名=hostname,应用程序名=program_name,工作站进程ID=hostprocess,域名=nt_domain,网卡地址=net_addressinto #t from(select 标志='死锁的进程',spID,kpID,a.blocked,dbID,uID,loginame,cpu,login_time,open_tran,status,hostname,program_name,hostprocess,nt_domain,net_address,s1=a.spID,s2=0from master..sysprocesses a join (select blocked from master..sysprocesses group by blocked)b on a.spID=b.blocked where a.blocked=0union allselect '|_牺牲品_>',blocked,s1=blocked,s2=1from master..sysprocesses a where blocked<>0)a order by s1,s2select @count=@@rowcount,@i=1if @count=0 and @show_spID_if_nolock=1begininsert #tselect 标志='正常的进程',db_name(dbID),net_addressfrom master..sysprocessesset @count=@@rowcountendif @count>0begincreate @R_403_5991@ #t1(ID int IDentity(1,a nvarchar(30),b Int,EventInfo nvarchar(255))if @kill_lock_spID=1begindeclare @spID varchar(10),@标志 varchar(10)while @i<=@countbeginselect @spID=进程ID,@标志=标志 from #t where ID=@iinsert #t1 exec('dbcc inputbuffer('+@spID+')')if @标志='死锁的进程' exec('kill '+@spID)set @i=@i+1endendelsewhile @i<=@countbeginselect @s='dbcc inputbuffer('+cast(进程ID as varchar)+')' from #t where ID=@iinsert #t1 exec(@s)set @i=@i+1endselect a.*,进程的SQL语句=b.EventInfofrom #t a join #t1 b on a.ID=b.IDendGOexec p_lockinfo 1,1生成存储过程后直接执行。 总结
以上是内存溢出为你收集整理的sqlserver2005死锁解决方案全部内容,希望文章能够帮你解决sqlserver2005死锁解决方案所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)