mssql sqlserver 死锁的查看方法分享


摘要:
下文分享sqlserver中死锁的查看方法分享,如下所示:
实验环境:sqlserver 2008 r2



1.死锁的快速查看方法

在查询分析器中输入:
sp_who active —查看类型为blk则为阻塞的记录集,此时我们找出此行的spid
在查询分析器中输入:
dbcc inputbuffer(@spid_blk) –获取阻塞所对应sql脚本信息,此sql脚本为此时正在运行的脚本,并且此脚本导致其它很多待运行对象被阻塞
在查询分析器中输入:
sp_lock —使用此命令所对应的objId为被阻塞sql锁定的对象ID
在查询分析器中输入:
select object_name(@objId) —可获取被锁定对象的名称,方便我们进一步核查对象是否建立索引,对象间的数据结构是否合理

2.通过sql脚本批量获取死锁涉及的对象

/*建立死锁获取存储过程*/
CREATE PROCEDURE pr_getLockInfo
AS
BEGIN
SET NOCOUNT ON;
declare @spid int,@blk int
DECLARE cur CURSOR FOR
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
OPEN cur
FETCH NEXT FROM cur INTO @spid,@blk
WHILE @@FETCH_STATUS = 0
begin
if @spid =0
select     ' 死锁进程号 : '+ CAST(@blk AS VARCHAR(30)) + ', sql脚本: '
else
select ' 进程号:'+ CAST(@spid AS VARCHAR(30))+ ' 被 ' + ' 进程号:'+ CAST(@blk AS VARCHAR(30)) +'
阻塞 , sql脚本: '
DBCC INPUTBUFFER (@blk )
FETCH NEXT FROM cur INTO @spid,@blk
end
CLOSE cur
DEALLOCATE cur
END
GO

exec pr_getLockInfo  ---获取当前死锁相关信息
/*
通过当前存储过程,可获取死锁相关信息
*/