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

简介: 链接 :http://www.cnblogs.com/mzhanker/archive/2011/06/04/2072739.html 使用sqlserver作为数据库的应用系统,都避免不了有时候会产生死锁, 死锁出现以后,维护人员或者开发人员大多只会通过sp_who来查找死锁的进程,然后用sp_kill杀掉。

链接 :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

 

直到最后的结果为:

 
相关文章
|
9月前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS费用价格:MySQL、SQL Server、PostgreSQL和MariaDB引擎收费标准
阿里云RDS数据库支持MySQL、SQL Server、PostgreSQL、MariaDB,多种引擎优惠上线!MySQL倚天版88元/年,SQL Server 2核4G仅299元/年,PostgreSQL 227元/年起。高可用、可弹性伸缩,安全稳定。详情见官网活动页。
1514 152
|
9月前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎,提供高性价比、稳定安全的云数据库服务,适用于多种行业与业务场景。
1076 156
|
9月前
|
SQL 人工智能 Linux
SQL Server 2025 RC1 发布 - 从本地到云端的 AI 就绪企业数据库
SQL Server 2025 RC1 发布 - 从本地到云端的 AI 就绪企业数据库
733 5
SQL Server 2025 RC1 发布 - 从本地到云端的 AI 就绪企业数据库
|
9月前
|
关系型数据库 分布式数据库 数据库
阿里云数据库收费价格:MySQL、PostgreSQL、SQL Server和MariaDB引擎费用整理
阿里云数据库提供多种类型,包括关系型与NoSQL,主流如PolarDB、RDS MySQL/PostgreSQL、Redis等。价格低至21元/月起,支持按需付费与优惠套餐,适用于各类应用场景。
|
10月前
|
SQL 人工智能 Linux
SQL Server 2025 RC0 发布 - 从本地到云端的 AI 就绪企业数据库
SQL Server 2025 RC0 发布 - 从本地到云端的 AI 就绪企业数据库
441 5
|
11月前
|
SQL 存储 数据库
SQL Server Management Studio (SSMS) 21 - 微软数据库管理工具
SQL Server Management Studio (SSMS) 21 - 微软数据库管理工具
1484 0
|
11月前
|
SQL XML Java
配置Spring框架以连接SQL Server数据库
最后,需要集成Spring配置到应用中,这通常在 `main`方法或者Spring Boot的应用配置类中通过加载XML配置或使用注解来实现。
786 0
|
9月前
|
缓存 关系型数据库 BI
使用MYSQL Report分析数据库性能(下)
使用MYSQL Report分析数据库性能
578 158
|
9月前
|
关系型数据库 MySQL 数据库
自建数据库如何迁移至RDS MySQL实例
数据库迁移是一项复杂且耗时的工程,需考虑数据安全、完整性及业务中断影响。使用阿里云数据传输服务DTS,可快速、平滑完成迁移任务,将应用停机时间降至分钟级。您还可通过全量备份自建数据库并恢复至RDS MySQL实例,实现间接迁移上云。
|
9月前
|
缓存 监控 关系型数据库
使用MYSQL Report分析数据库性能(中)
使用MYSQL Report分析数据库性能
621 156

热门文章

最新文章