死锁查看处理(一)-阿里云开发者社区

开发者社区> 数据库> 正文

死锁查看处理(一)

简介: 原文:死锁查看处理(一) 1、exec sp_who2 执行存储过程查看那些语句处于挂起或者阻塞状态。 spid 表示当前回话ID 唯一的 status表示状态当前执行的状态 当状态为SUSPENDED时说明当前语句为挂起状态 HostName 表示回话客户端的计算机名称 Blkby 表示的是令当前回话阻塞的其他回话ID。
原文:死锁查看处理(一)

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

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
数据库
使用钉钉扫一扫加入圈子
+ 订阅

分享数据库前沿,解构实战干货,推动数据库技术变革

其他文章