科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网网络频道用存储过程查出引起死锁的进程和SQL语句

用存储过程查出引起死锁的进程和SQL语句

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

假如发生了死锁,我们怎么去检测具体发生死锁的是哪条SQL语句或存储过程?此时我们可以使用以下存储过程来检测,就可以查出引起死锁的进程和SQL语句。

作者:赛迪网 Alice 来源:天新网 2008年3月22日

关键字: 数据库 SQL Mssql SQL Server

  • 评论
  • 分享微博
  • 分享邮件

假如发生了死锁,我们怎么去检测具体发生死锁的是哪条SQL语句或存储过程?此时我们可以使用以下存储过程来检测,就可以查出引起死锁的进程和SQL语句。

use master
go
create procedure sp_who_lock
as
begin
declare @spid int,@bl int,
@intTransactionCountOnEntry int,
@intRowcount int,
@intCountProperties int,
@intCounter int

create table #tmp_lock_who (
id int identity(1,1),
spid smallint,
bl smallint)

IF @@ERROR<>0 RETURN @@ERROR

insert into #tmp_lock_who(spid,bl) select 0 ,blocked
from (select * from sysprocesses where blocked>0 ) a 
where not exists(select * from 
(select * from sysprocesses where blocked>0 ) b 
where a.blocked=spid)
union select spid,blocked from sysprocesses where blocked>0

IF @@ERROR<>0 RETURN @@ERROR 

-- 找到临时表的记录数
select @intCountProperties = Count(*),@intCounter = 1
from #tmp_lock_who

IF @@ERROR<>0 RETURN @@ERROR 

if @intCountProperties=0
select "现在没有阻塞和死锁信息" as message

-- 循环开始
while @intCounter <= @intCountProperties
begin
-- 取第一条记录
select @spid = spid,@bl = bl
from #tmp_lock_who where Id = @intCounter 
begin
if @spid =0 
select "引起数据库死锁的是: "+ CAST(@bl AS VARCHAR(10)) 
+ "进程号,其执行的SQL语法如下"
else
select "进程号SPID:"+ CAST(@spid AS VARCHAR(10))+ "被" 
+ "进程号SPID:"+ CAST(@bl AS VARCHAR(10)) +"阻塞,其当
前进程执行的SQL语法如下"DBCC INPUTBUFFER
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章