查询Sqlserver数据库死锁的一个存储过程分享_MsSql

使用sqlserver作为数据库的应用系统,都避免不了有时候会产生死锁, 死锁出现以后,维护人员或者开发人员大多只会通过sp_who来查找死锁的进程,然后用sp_kill杀掉。利用sp_who_lock这个存储过程,可以很方便的知道哪个进程出现了死锁,出现死锁的问题在哪里.

创建sp_who_lock存储过程

CREATE procedure sp_who_lock
as
begin
  declare @spid int
  declare @blk int
  declare @count int
  declare @index int
  declare @lock tinyint
  set @lock=0
  create table #temp_who_lock
 (
 id int identity(1,1),
 spid int,
 blk int
 )
 if @@error<>0 return @@error
 insert into #temp_who_lock(spid,blk)
 select 0 ,blocked
 from (select * from master..sysprocesses where blocked>0)a
 where not exists(select * from master..sysprocesses where a.blocked =spid and blocked>0)
 union select spid,blocked from master..sysprocesses where blocked>0
 if @@error<>0 return @@error
 select @count=count(*),@index=1 from #temp_who_lock
 if @@error<>0 return @@error
 if @count=0
 begin
 select '没有阻塞和死锁信息'
 return 0
 end
 while @index<=@count
 begin
 if exists(select 1 from #temp_who_lock a where id>@index and exists(select 1 from #temp_who_lock where id<=@index and a.blk=spid))
 begin
  set @lock=1
  select @spid=spid,@blk=blk from #temp_who_lock where id=@index
  select '引起数据库死锁的是: '+ CAST(@spid AS VARCHAR(10)) + '进程号,其执行的SQL语法如下'
  select @spid, @blk
  dbcc inputbuffer(@spid)
  dbcc inputbuffer(@blk)
 end
 set @index=@index+1
 end
 if @lock=0
 begin
 set @index=1
 while @index<=@count
 begin
  select @spid=spid,@blk=blk from #temp_who_lock where id=@index
  if @spid=0
  select '引起阻塞的是:'+cast(@blk as varchar(10))+ '进程号,其执行的SQL语法如下'
  else
  select '进程号SPID:'+ CAST(@spid AS VARCHAR(10))+ '被' + '进程号SPID:'+ CAST(@blk AS VARCHAR(10)) +'阻塞,其当前进程执行的SQL语法如下'
  dbcc inputbuffer(@spid)
  dbcc inputbuffer(@blk)
  set @index=@index+1
 end
 end
 drop table #temp_who_lock
 return 0
end
GO

在查询分析器中执行:

exec sp_who_lock

直到最后的结果为:**

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索sqlserver
数据库死锁
mssql 数据库死锁、sql server数据库死锁、sqlserver数据库死锁、mssql 死锁、mssql 查询死锁,以便于您获取更多的相关知识。

时间: 2024-10-03 01:20:08

查询Sqlserver数据库死锁的一个存储过程分享_MsSql的相关文章

查询Sqlserver数据库死锁的一个存储过程分享

使用sqlserver作为数据库的应用系统,都避免不了有时候会产生死锁, 死锁出现以后,维护人员或者开发人员大多只会通过sp_who来查找死锁的进程,然后用sp_kill杀掉.利用sp_who_lock这个存储过程,可以很方便的知道哪个进程出现了死锁,出现死锁的问题在哪里. 创建sp_who_lock存储过程 CREATE procedure sp_who_lock as begin declare @spid int declare @blk int declare @count int de

查询Sqlserver数据库死锁的一个存储过程(转)

链接 :http://www.cnblogs.com/mzhanker/archive/2011/06/04/2072739.html 使用sqlserver作为数据库的应用系统,都避免不了有时候会产生死锁, 死锁出现以后,维护人员或者开发人员大多只会通过sp_who来查找死锁的进程,然后用sp_kill杀掉.利用sp_who_lock这个存储过程,可 以很方便的知道哪个进程出现了死锁,出现死锁的问题在哪里. 创建sp_who_lock存储过程 ? CREATE procedure sp_who

SqlServer表死锁的解决方法分享_MsSql

其实不光是上面描述的情况会锁住表,还有很多种场景会使表放生死锁,解锁其实很简单,下面用一个示例来讲解: 1 首先创建一个测试用的表: 复制代码 代码如下: CREATE TABLE Test ( TID INT IDENTITY(1,1) ) 2 执行下面的SQL语句将此表锁住: 复制代码 代码如下: SELECT * FROM Test WITH (TABLOCKX) 3 通过下面的语句可以查看当前库中有哪些表是发生死锁的: 复制代码 代码如下: SELECT request_session_

C#查询SqlServer数据库并返回单个值的方法

  本文实例讲述了C#查询SqlServer数据库并返回单个值的方法.分享给大家供大家参考.具体实现方法如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 static public string GetSqlAsString(string sqlText, SqlParameter[] sqlParameters, string databaseConnectionString) { string result = ""; Sq

日常收集整理SqlServer数据库优化经验和注意事项_MsSql

网上关于SQL优化的教程很多,但是比较杂乱.近日有空整理了一下,写出来跟大家分享一下,其中有错误和不足的地方,还请大家纠正补充. 优化数据库的注意事项: 1.关键字段建立索引. 2.使用存储过程,它使SQL变得更加灵活和高效. 3.备份数据库和清除垃圾数据. 4.SQL语句语法的优化.(可以用Sybase的SQL Expert,可惜我没找到unexpired的序列号) 5.清理删除日志. SQL语句优化的基本原则: 1.使用索引来更快地遍历表. 缺省情况下建立的索引是非群集索引,但有时它并不是最

sqlserver 数据库压缩与数据库日志(ldf)压缩方法分享_MsSql

Access 操作很简单,具体不步骤如下:打开你mdb数据库,工具-->数据库实用工具-->压缩和修复数据库(c)... SQL SERVER 一般情况下,SQL数据库的收缩并不能很大程度上减小数据库大小,其主要作用是收缩日志大小,应当定期进行此操作以免数据库日志过大 1.设置数据库模式为简单模式:打开SQL企业管理器,在控制台根目录中依次点开Microsoft SQLServer-->SQLServer组-->双击打开你的服务器-->双击打开数据库目录-->选择你的数

扩展性很好的一个分页存储过程分享_MsSql

这是经常用的一个分页存储过程 希望大家指点不足 复制代码 代码如下: USE [a6756475746] GO /****** Object: StoredProcedure [dbo].[tbl_order_SearchWhereAndPage] Script Date: 11/01/2011 09:37:39 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER PROCEDURE [dbo].[tbl_order_Se

sql处理数据库锁的存储过程分享_MsSql

邹建 2004.4 复制代码 代码如下: /*--调用示例 exec p_lockinfo1 --*/ alter proc p_lockinfo1 @kill_lock_spid bit=1, --是否杀掉死锁的进程,1 杀掉, 0 仅显示 @show_spid_if_nolock bit=1 --如果没有死锁的进程,是否显示正常进程信息,1 显示,0 不显示 as declare @count int,@s nvarchar(max),@i int select id=identity(in

SqlServer表死锁的解决方法分享

其实不光是上面描述的情况会锁住表,还有很多种场景会使表放生死锁,解锁其实很简单,下面用一个示例来讲解: 1 首先创建一个测试用的表: 复制代码 代码如下: CREATE TABLE Test ( TID INT IDENTITY(1,1) ) 2 执行下面的SQL语句将此表锁住: 复制代码 代码如下: SELECT * FROM Test WITH (TABLOCKX) 3 通过下面的语句可以查看当前库中有哪些表是发生死锁的: 复制代码 代码如下: SELECT request_session_