查询Sqlserver数据库死锁的一个存储过程(转)

链接 :http://www.cnblogs.com/mzhanker/archive/2011/06/04/2072739.html

使用sqlserver作为数据库的应用系统,都避免不了有时候会产生死锁, 死锁出现以后,维护人员或者开发人员大多只会通过sp_who来查找死锁的进程,然后用sp_kill杀掉。利用sp_who_lock这个存储过程,可 以很方便的知道哪个进程出现了死锁,出现死锁的问题在哪里.

创建sp_who_lock存储过程

?

CREATE procedure sp_who_lock  

as     

begin     

   declare @spid int     

   declare @blk int     

   declare @count int     

   declare @index int     

   declare @lock tinyint     

   set @lock=0     

   create table #temp_who_lock     

 (     

  id int identity(1,1),     

  spid int,     

  blk int     

 )     

 if @@error<>0 return @@error     

 insert into #temp_who_lock(spid,blk)     

 select 0 ,blocked      

 from (select * from master..sysprocesses where blocked>0)a     

 where not exists(select * from  master..sysprocesses where a.blocked =spid and blocked>0)     

 union select spid,blocked from  master..sysprocesses where blocked>0     

 if @@error<>0 return @@error     

 select @count=count(*),@index=1 from #temp_who_lock     

 if @@error<>0 return @@error     

 if @count=0     

 begin     

  select '没有阻塞和死锁信息'     

  return 0     

 end     

 while @index<=@count      

 begin     

  if exists(select 1 from #temp_who_lock a where id>@index and exists(select 1 from #temp_who_lock where id<=@index and a.blk=spid))     

  begin     

   set @lock=1     

   select @spid=spid,@blk=blk from #temp_who_lock where id=@index     

   select '引起数据库死锁的是: '+ CAST(@spid AS VARCHAR(10)) + '进程号,其执行的SQL语法如下'     

   select  @spid, @blk   

   dbcc inputbuffer(@spid)     

   dbcc inputbuffer(@blk)     

  end     

  set @index=@index+1     

 end     

 if @lock=0      

 begin     

  set @index=1     

  while @index<=@count      

  begin     

   select @spid=spid,@blk=blk from #temp_who_lock where id=@index     

   if @spid=0     

    select '引起阻塞的是:'+cast(@blk as varchar(10))+ '进程号,其执行的SQL语法如下'     

   else      

    select '进程号SPID:'+ CAST(@spid AS VARCHAR(10))+ '被' + '进程号SPID:'+ CAST(@blk AS VARCHAR(10)) +'阻塞,其当前进程执行的SQL语法如下'     

   dbcc inputbuffer(@spid)   

   dbcc inputbuffer(@blk)     

   set @index=@index+1     

  end     

 end     

 drop table #temp_who_lock     

 return 0     

end           

 

 

GO

在查询分析器中执行:

exec sp_who_lock

 

直到最后的结果为:

 

时间: 2024-07-31 03:22:16

查询Sqlserver数据库死锁的一个存储过程(转)的相关文章

查询Sqlserver数据库死锁的一个存储过程分享_MsSql

使用sqlserver作为数据库的应用系统,都避免不了有时候会产生死锁, 死锁出现以后,维护人员或者开发人员大多只会通过sp_who来查找死锁的进程,然后用sp_kill杀掉.利用sp_who_lock这个存储过程,可以很方便的知道哪个进程出现了死锁,出现死锁的问题在哪里. 创建sp_who_lock存储过程 CREATE procedure sp_who_lock as begin declare @spid int declare @blk int declare @count int de

查询Sqlserver数据库死锁的一个存储过程分享

使用sqlserver作为数据库的应用系统,都避免不了有时候会产生死锁, 死锁出现以后,维护人员或者开发人员大多只会通过sp_who来查找死锁的进程,然后用sp_kill杀掉.利用sp_who_lock这个存储过程,可以很方便的知道哪个进程出现了死锁,出现死锁的问题在哪里. 创建sp_who_lock存储过程 CREATE procedure sp_who_lock as begin declare @spid int declare @blk int declare @count int de

C#查询SqlServer数据库并返回单个值的方法

  本文实例讲述了C#查询SqlServer数据库并返回单个值的方法.分享给大家供大家参考.具体实现方法如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 static public string GetSqlAsString(string sqlText, SqlParameter[] sqlParameters, string databaseConnectionString) { string result = ""; Sq

SqlServer定时备份数据库和定时杀死数据库死锁解决

原文:SqlServer定时备份数据库和定时杀死数据库死锁解决 上周五组长更我说了一句要杀死数据库的死锁进程,因为自己对数据库不是很熟悉,突然组长说了我也就决定一定要倒腾一下,不然自己怎么提高呢?现在不研究,说不定下次还是要研究呢,倒腾出来了就可以在下次用到了,后来组长又补了一句:"还有定是备份数据库的问题要解决",说干就干. PS:Sqlserver 2008 R2,windows 8 64位 1.备份数据库  因为要备份,我们就要用到Sqlserver的代理,默认数据库的代理是不开

server-SQL Server 2008在多个数据库中创建同一个存储过程

问题描述 SQL Server 2008在多个数据库中创建同一个存储过程 十几个数据库,只有一个存储过程,我不想一个一个数据库去创建,有什么办法执行一遍之后十几个数据库都创建好这个存储过程 解决方案 你不如自己写个程序,里面可以设置数据库连接数组,挨个的通过代码自动创建存储过程 解决方案二: http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.connectiontimeout.aspx 解决方案

用Asp.net还原与恢复sqlserver数据库

上次做了个项目,涉及到数据库的还原和恢复,到网上找了一下,是利用SQLDMO实现的,只要添加SQLDMO引用就好了,然后利用下边的类的方法就可以实现了. 我把原作者的类扩充了一下,可以自动识别web.config里 的数据库连接字符串,可以通过变量设置还原恢复的信息. 需要注意的时还原,还原的时候问题最大了,有别的用户使用数据库的时候无法还原,解决办法就是在MASTER数据库中添加一个存储过程: createprockillspid(@dbnamevarchar(20)) as begin de

SQL Server 在多个数据库中创建同一个存储过程(Create Same Stored Procedure in All Databases)

原文:SQL Server 在多个数据库中创建同一个存储过程(Create Same Stored Procedure in All Databases) 一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 遇到的问题(Problems) 实现代码(SQL Codes) 方法一:拼接SQL: 方法二:调用模板存储过程创建存储过程: 总结 扩展阅读 参考文献(References) 二.背景(Contexts) 在我的数据库服务器上,同一个实例

C语言与sqlserver数据库

原文:C语言与sqlserver数据库 1.使用C语言来操作SQL SERVER数据库,采用ODBC开放式数据库连接进行数据的添加,修改,删除,查询等操作. step1:启动SQLSERVER服务,例如:HNHJ,开始菜单 ->运行 ->net start mssqlserver step2:打开企业管理器,建立数据库test,在test库中建立test表(a varchar(200),b varchar(200)) step3:建立系统DSN,开始菜单 ->运行 ->odbcad

如何通过asp.net将ACCESS数据库里的2张表导入到SQLserver数据库里

问题描述 如何通过asp.net将ACCESS数据库里的2张表导入到SQLserver数据库里点一个按钮将ACCESS数据库里的表导入到SQLServer数据库中可以是临时表我这样的目的是方便读取数据库感觉这样做好操作一点!希望高手可以把关键代码写出来谢谢了 解决方案 解决方案二:妈哟,为什么没有来回答我的问题啊???????????????解决方案三:你把ACCESS数据表里面的数据读取出来.然后再写进SQL里撒...解决方案四:我知道这个原理,但实现不是很了解有实际的代码吗?或者关键字的代码