查询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     

   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<[email protected]count      

 begin     

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

  begin     

   set @lock=1     

   select @spid=spid,@blk=blk from #temp_who_lock where [email protected]index     

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

   select  @spid, @blk   

   dbcc inputbuffer(@spid)     

   dbcc inputbuffer(@blk)     

  end     

  set @index[email protected]index+1     

 end     

 if @lock=0      

 begin     

  set @index=1     

  while @index<[email protected]count      

  begin     

   select @spid=spid,@blk=blk from #temp_who_lock where [email protected]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[email protected]index+1     

  end     

 end     

 drop table #temp_who_lock     

 return 0     

end           

 

 

GO

在查询分析器中执行:

exec sp_who_lock

直到最后的结果为:

文章地址

时间: 2024-08-28 22:59:38

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

查询MS SQL Server数据库死锁的一个存储过程

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

查询sqlserver数据库视图、存储过程等包含特定的字符串

? 1 2 3 4 5 6 SELECT  A.name ,         B.definition FROM    SYS.objects A         INNER JOIN sys.sql_modules B ON A.object_id = B.object_id                                         AND ( CHARINDEX('包含字符',                                               

SQLserver 数据库的索引,存储过程和触发器的使用与概念

前言:索引,存储过程和触发器可以对一些高级的数据处理和查询,从而更好的实现对数据库的操作,诊断和优化. 一.索引 索引提供指针以指向存储在表中指定的数据值,数据库的索引,就好比一本书中的目录类似,无需阅读整个一本书,利用目录就可以快速的查找所需信息.在数据库中,索引使数据库程序无需对整个表进行扫描,就可以在其中找到所需数据.通过使用索引,可以大大提高数据库的查询速度 (1) 索引分类 1.唯一索引 唯一索引不允许两行具有相同索引值 2.主键索引 在数据库关系图中为表定义一个主键将自动创建主键索引

SQLSERVER数据库死锁与优化杂谈

死锁杂谈 当数据库死锁时,SqlServer会释放一个优先级较低的锁,让另一个事务运行:所以,即时去捕捉数据库死锁,是挺不容易的. 如果,数据库死锁比较长时间,那么死锁是可以被捕捉的. 可以用SqlServer活动监视器来查看,哪些进程锁了数据库. 首先打开SqlServer活动监视器,然后可以看到,界面里有进程,查看资源,数据文件I/O,最近消耗大量资源的查询四项. 四项显示内容如下: 进程:在进程里可以看到哪些进程被阻塞,查看属性[阻塞者]可以看到,[阻塞者]的会话ID. 等待资源:等待资源

查询SQL数据库死锁

使用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

Go语言中查询SqlServer数据库

一.Go语言中查询MsSQL数据库: // main.go package main import ( "database/sql" "fmt" "log" "time" _ "github.com/denisenkom/go-mssqldb" ) func main() { var isdebug = true var server = "localhost" var port = 1

软件工程概论01:JavaWeb连接SQLServer数据库并完成一个登录界面及其功能设计。

1.连接数据库package com.jaovo.msg.Util;import java.sql.*; public class DBUtil { public static Connection getConnection() {  //加载驱动  String dbDrive="com.mysql.jdbc.Driver";  try {   try {    Class.forName(dbDrive).newInstance();   } catch (Instantiati

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

PS:Sqlserver 2008 R2,windows 8 64位 1.备份数据库 因为要备份,我们就要用到Sqlserver的代理,默认数据库的代理是不开启的.需要我们手动开启的. 执行备份数据库脚本,现在将脚本公布,其实将这一段代码中需要保存的文件路径和数据库名称替换一下就可以实现备份了.但是还没有达到定时备份的目的 ? 1 2 3 4 5 6 7 8 9 10 11 --自动备份并保存最近5天的SQL数据库作业脚本 宋彪 20130310 DECLARE @filename VARCHA

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

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