1、exec sp_who2 执行存储过程查看那些语句处于挂起或者阻塞状态。
spid 表示当前回话ID 唯一的
status表示状态当前执行的状态 当状态为SUSPENDED时说明当前语句为挂起状态
HostName 表示回话客户端的计算机名称
Blkby 表示的是令当前回话阻塞的其他回话ID。正常表示为 .
DBName 表示当前回话连接的数据库名称
状态为SUSPENDED 时,需要查看列Blkby列是否为空,为空表示是挂起的头部。
若Blkby列为数字@spid,则需要根据@spid来查找列SPID中对应的@spid行的信息,依次循环查找到Blkby为空的行,则此回话则为阻塞的头部。
2、DBCC INPUTBUFFER(72) 查看回话ID72 当前执行的sql语句,EventInfo列为执行语句。
3、Kill 72 ,解除死锁需要kill掉阻塞的头spid ,若spid72 ,则执行
kill 72
4、sp_who2简化去掉正常的回话,可执行 exec GetLock 存储过程
code:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <YSH>
-- Create date: <20140722>
-- Description: <查看锁表原因>
-- =============================================
create PROCEDURE GetLock
AS
BEGIN
declare @tblDetail varchar(60),@nowsj varchar(10),
@sql varchar(8000),@where varchar(8000)
set @nowsj= replace(convert(varchar,getdate(),114),':','')
set @tblDetail='tblLock'+convert(varchar,@@spid)+@nowsj
set @sql='create table '+@tblDetail+'
(
spid varchar(10),
[Status] varchar(50),
[Login] varchar(50),
HostName varchar(100),
BlkBy varchar(10),
DBName varchar(100),
Command varchar(100),
CPUTime bigint,
DiskIO bigint,
LastBatch varchar(20),
programName varchar(100),
spid1 varchar(10),
REQUESTID varchar(10)
) '
--print @sql
exec(@sql)
set @sql='insert '+@tblDetail+' exec sp_who2 '
--print @sql
exec(@sql)
---查找阻塞其他连接的连接
set @sql='select * from '+@tblDetail+' MX
where Rtrim(Ltrim(blkby))=''.''
and exists(select * from '+@tblDetail+' A where A.blkby=MX.spid)
order by spid '
--print @sql
exec(@sql)
---查找被其他连接阻塞的连接 以及 阻塞其他连接的连接
set @sql='select * from '+@tblDetail+' MX
where Rtrim(Ltrim(blkby))<>''.''
or exists(select * from '+@tblDetail+' A where A.blkby=MX.spid)
order by spid '
--print @sql
exec(@sql)
exec('drop table '+@tblDetail)
END
GO