sqlserver检测死锁;杀死锁和进程;查看锁信息

http://blog.sina.com.cn/s/blog_9dcdd2020101nf4v.html

sqlserver检测死锁;杀死锁和进程;查看锁信息 (2013-06-09 16:43:03)转载▼
标签: sql 检测死锁 杀死锁和进程 查看锁信息 it    分类: mssql

--检测死锁

--如果发生死锁了,我们怎么去检测具体发生死锁的是哪条SQL语句或存储过程?

--这时我们可以使用以下存储过程来检测,就可以查出引起死锁的进程和SQL语句。SQL Server自带的系统存储过程sp_who和sp_lock也可以用来查找阻塞和死锁, 但没有这里介绍的方法好用。

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 (@bl )

 end 

-- 循环指针下移
 set @intCounter = @intCounter + 1

end

drop table #tmp_lock_who

return 0

end

--杀死锁和进程

--如何去手动的杀死进程和锁?最简单的办法,重新启动服务。但是这里要介绍一个存储过程,通过显式的调用,可以杀死进程和锁。

use master

go

if exists (select * from dbo.sysobjects where id = object_id(N‘[dbo].[p_killspid]‘) and OBJECTPROPERTY(id, N‘IsProcedure‘) = 1)

drop procedure [dbo].[p_killspid]

GO

create proc p_killspid

@dbname varchar(200)    --要关闭进程的数据库名
as  

    declare @sql  nvarchar(500)  

    declare @spid nvarchar(20)

    declare #tb cursor for

        select spid=cast(spid as varchar(20)) from master..sysprocesses where dbid=db_id(@dbname)

    open #tb

    fetch next from #tb into @spid

    while @@fetch_status=0

    begin  

        exec(‘kill ‘+@spid)

        fetch next from #tb into @spid

    end  

    close #tb

    deallocate #tb

go

--用法
exec p_killspid  ‘newdbpy‘

--查看锁信息

--如何查看系统中所有锁的详细信息?在企业管理管理器中,我们可以看到一些进程和锁的信息,这里介绍另外一种方法。

--查看锁信息
create table #t(req_spid int,obj_name sysname)

declare @s nvarchar(4000)

    ,@rid int,@dbname sysname,@id int,@objname sysname

declare tb cursor for 

    select distinct req_spid,dbname=db_name(rsc_dbid),rsc_objid

    from master..syslockinfo where rsc_type in(4,5)

open tb

fetch next from tb into @rid,@dbname,@id

while @@fetch_status=0

begin

    set @s=‘select @objname=name from [‘+@dbname+‘]..sysobjects where [email protected]‘

    exec sp_executesql @s,N‘@objname sysname out,@id int‘,@objname out,@id

    insert into #t values(@rid,@objname)

    fetch next from tb into @rid,@dbname,@id

end

close tb

deallocate tb

select 进程id=a.req_spid

    ,数据库=db_name(rsc_dbid)

    ,类型=case rsc_type when 1 then ‘NULL 资源(未使用)‘

        when 2 then ‘数据库‘

        when 3 then ‘文件‘

        when 4 then ‘索引‘

        when 5 then ‘表‘

        when 6 then ‘页‘

        when 7 then ‘键‘

        when 8 then ‘扩展盘区‘

        when 9 then ‘RID(行 ID)‘

        when 10 then ‘应用程序‘

    end

    ,对象id=rsc_objid

    ,对象名=b.obj_name

    ,rsc_indid

 from master..syslockinfo a left join #t b on a.req_spid=b.req_spid

go

drop table #t
时间: 2024-09-27 22:14:20

sqlserver检测死锁;杀死锁和进程;查看锁信息的相关文章

查看锁信息(开启InnoDB监控)

当前mysql版本:5.6.21 一.背景 在mysql处理死锁问题时,由于show engine innodb status输出来的死锁日志无任务事务上下文,并不能很好地诊断相关事务所持有的所有锁信息,包括:锁个数.锁类型等. 于是,需要能查看到更详细的事务锁占用情况. 二.INNODB监控机制(InnoDB Monitors) mysql提供一套INNODB监控机制,用于周期性(每15钞)输出INNODB运行相关状态(INNODB运行状态.表空间状态.表状态等)到mysqld服务标准错误输出

SQL Server 2008中查看锁信息

;with tran_locks as(select resource_type,db_name(resource_database_id) as db_name,resource_description   ,object_name(resource_associated_entity_id,resource_database_id) as object_name,request_mode,request_type,request_status,request_session_id   fro

sqlserver锁机制详解(sqlserver查看锁)

简介 在SQL Server中,每一个查询都会找到最短路径实现自己的目标.如果数据库只接受一个连接一次只执行一个查询.那么查询当然是要多快好省的完成工作.但对于 大多数数据库来说是需要同时处理多个查询的.这些查询并不会像绅士那样排队等待执行,而是会找最短的路径执行.因此,就像十字路口需要一个红绿灯那 样,SQL Server也需要一个红绿灯来告诉查询:什么时候走,什么时候不可以走.这个红绿灯就是锁. 图1.查询可不会像绅士们那样按照次序进行排队 为什么需要锁 在开始谈锁之前,首先要简单了解一下事

什么是死锁?死锁产生的原因?

什么是死锁? 死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去. 集合中的每一个进程都在等待只能由本集合中的其他进程才能引发的事件,那么该组进程是死锁的. 举个例子来描述,如果此时有一个线程A,按照先锁a再获得锁b的的顺序获得锁,而在此同时又有另外一个线程B,按照先锁b再锁a的顺序获得锁.如下图所示: 产生死锁的原因? 1.竞争资源 系统中的资源可以分为两类:一类是可剥夺资源,是指某进程在获得这类资源后,该资源可以再

什么是死锁及死锁的必要条件和解决方法【转】

转自:http://blog.csdn.net/abigale1011/article/details/6450845/ 来自:http://blog.163.com/[email protected]/blog/static/128388169200982444858590/?fromdm&fromSearch&isFromSearchEngine=yes 进程死锁及解决办法 操作系统 2009-09-24 16:48:58 阅读767 评论1   字号:大中小 订阅 一.要点提示 (1

【操作系统-死锁】死锁发生的条件是什么?死锁的避免和预防方法

digest:本文章简要概述操作系统死锁的原因以及预防和解决方法. 1.死锁的定义 死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种进程间相互阻塞的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程.                                                                ——汤小丹等.<计算机操作系统>:西安电子科技大学出版社,2012.

sqlserver锁表、解锁、查看锁表

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 面演示一个实例,它使用sys.dm_tran_locks动态视图监视数据库中锁的活动. 打开一个查询窗口,执行如下语句: USE AdventureWorks BEGIN TRAN SELECT ProductID, ModifiedDate FROM Production.ProductDocument WITH (TABLOCKX) 打开另一个查询窗口

以上的进程查看均可以执行“man 进程名”来查看进程的功能细节CentOS-6.5-NFS部署

nfs-server与nfs-client端配置一样 [[email protected] /]# uname -r    打印系统版本 2.6.32-431.el6.x86_64 [[email protected] ~]# rpm -aq nfs-utils portmap rpcbind        #检查nfs相关的包 nfs-utils-1.2.3-39.el6.x86_64 rpcbind-0.2.0-11.el6.x86_64 [[email protected] /]# tai

Linux进程查看与管理

(A).进程相关的概念 计算机实际上可以做的事情实质上非常简单,比如计算两个数的和,再比如在内存中寻找到某个地址等等.这些最基础的计算机动作被称为指令(instruction).程序(program)是由这些指令的集合所构成.程序一般是存储在磁盘上某个路径下的一个可执行文件,程序运行起来后,便成了进程(process),因此,进程便是程序的具体实现.因为Linux的哲学思想之一便是组合小程序,完成复杂任务,因此,要完成某功能可能需要启动多个小程序,因此,进程也会产生多个.进程都运行于内存当中.