`
xiaoshan5634
  • 浏览: 73997 次
  • 性别: Icon_minigender_1
  • 来自: 东莞
社区版块
存档分类
最新评论

检测数据死锁进程的存储过程

阅读更多
/*---------------------------------------------------------------------------------------

名称:sp_who_lock
功能:用来检测是否有死锁的进程,如果有,把造成死锁的进程ID,HostName, ProgramName 和执行的SQL
      语句保存到表DeadLockLog

参数: @SaveToTable 用来标示是否保存死锁进程到表DeadLockLog
	1 是, 0 否, 默认 = 0

     @PrintRootCauseOnly 是否只显示造成死锁的根源进程信息
        1 只显示死锁根源进程 0 除显示死锁根源进程外,还显示被阻塞的进程, 默认 = 0


---------------------------------------------------------------------------------------*/

ALTER   procedure dbo.sp_who_lock
	@SaveToTable int = 0,
	@PrintRootCauseOnly int = 1
as
begin

set nocount on
declare @spid int,@bl int,
	@intTransactionCountOnEntry int,
        @intRowcount int,
        @intCountProperties int,
        @intCounter int,
	@HostName nchar(128),
	@ProgramName nchar(128),
	@SQLCmd as varchar(1000)
 
create table #tmp_lock_who (
	id int identity(1,1),
	spid smallint,
	bl smallint)

create table #tmpSQL (EventType varchar(100),
	Parameters int,
	EventInfo varchar(2000))

 
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 N'现在没有阻塞和死锁信息' as message
-- 循环开始

while @intCounter <= @intCountProperties
begin
	-- 取第一条记录
	select @spid = spid,@bl = bl
		from #tmp_lock_who where Id = @intCounter
	begin
		if @spid =0
        		print N'* 引起数据库死锁的是: '+ CAST(@bl AS VARCHAR(10)) + N'进程号,其执行的SQL语法如下'
		else
			begin
				if @PrintRootCauseOnly <> 1
		        		print N'进程号SPID:'+ CAST(@spid AS VARCHAR(10))+ N'被' + N'进程号SPID:'+ CAST(@bl AS VARCHAR(10)) +N'阻塞,其当前进程执行的SQL语法如下'
			end

		--Get bolocker's host name and program name
		select @HostName = hostname, @ProgramName = program_name 
			from sysprocesses 
			where SPID = @bl

		truncate table #tmpSQL
		select @SQLCmd = 'dbcc inputbuffer(' + cast(@bl as varchar(10)) + ') with no_infomsgs'
		insert into  #tmpSQL exec(@SQLCmd)
		
		select @SQLCmd = EventInfo from #tmpSQL

		if @PrintRootCauseOnly <> 1 or @spid =0
		begin
			print @SQLCmd
			print ' '
		end

		if @SaveToTable = 1 and @spid =0   --写入引起数据库死锁的进程号到DeadLockLog
			insert into DeadLockLog 
				(SPID,HostName,ProgramName,SQLExec,FindDate) values
				(@bl,@HostName,@ProgramName,@SQLCmd,getdate())

		
		 --DBCC INPUTBUFFER (@bl )
	end
 
	-- 循环指针下移
	set @intCounter = @intCounter + 1
end
 
 
drop table #tmp_lock_who
drop table #tmpSQL

set nocount off
 
return 0

end
 
 



GO
SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO
分享到:
评论

相关推荐

    Sqlserver分析死锁进程

    本文将详细介绍如何在SQL Server中分析死锁进程,特别是如何通过存储过程来捕捉和分析死锁信息。 ### 死锁分析存储过程 在给定的部分内容中,可以看到一个名为`sp_check_lock`的存储过程被创建,其主要目的是检查...

    查询SQL server数据库死锁存储过程

    通过上述代码,我们可以看出这个存储过程的主要功能是检测SQL Server中出现的死锁情况,并提供有关被阻塞进程的信息,包括它们正在执行的SQL语句。这对于诊断和解决SQL Server中的死锁问题非常有帮助。此外,它还...

    死锁的检测与接触 C语言

    4. 当检测到死锁时,调用`remove()`函数,撤销所有死锁进程,释放它们占用的资源,并重新显示系统状态。 源代码中,`check()`函数遍历进程,检查每个进程是否能获得其请求的全部资源。如果可以,说明进程是安全的;...

    模拟死锁检测算法[死锁检测算法实现]

    在`readData`函数中,我们读取了资源分配表文件和进程等待表文件,并将数据存储在`occupy`和`wait`数组中。 在`main`函数中,我们首先调用`initial`函数来初始化进程等待表和资源分配表。然后,我们读取资源分配表...

    sql server 死锁检测

    除了使用存储过程检测死锁之外,还可以采取以下措施来预防和解决死锁问题: - **调整事务隔离级别**:通过设置更低的事务隔离级别可以减少锁的使用,降低死锁的可能性。 - **锁定顺序**:确保所有事务按照相同的...

    死锁检测算法C++.rar_VC 死锁_Vc_c++检测死锁_死锁_死锁的检测

    在C++中实现死锁检测,通常需要定义数据结构来存储进程和资源的信息,包括每个进程当前持有的资源、请求的资源以及资源的总量。然后,可以通过深度优先搜索(DFS)或者拓扑排序等图算法来检测循环等待条件,若找到...

    sqlserver2000中如何自动杀死死锁进程.pdf

    以下是如何在SQL Server 2000中创建一个名为`sp_killlock`的存储过程,以便自动检测并(如果需要)杀死死锁进程的详细步骤: 首先,我们需要创建存储过程`sp_killlock`。以下为存储过程的定义: ```sql CREATE proc...

    死锁的检测与分析设计

    操作系统中的死锁是多进程环境下的一种常见问题,它发生在两个或多个进程互相等待对方持有的资源而无法继续执行的情况。死锁的检测与分析是确保系统稳定性和效率的关键环节。在这个课程设计中,我们将探讨如何通过...

    死锁检测算法

    死锁是指两个或多个进程在执行过程中,由于竞争资源而造成的一种僵局状态,在这种状态下,进程无法继续执行。为了避免死锁对系统造成的影响,需要设计有效的死锁检测算法来发现并解决死锁问题。 #### 二、算法原理 ...

    手写死锁检测组件1

    死锁是指多个线程或者进程在运行过程中因争夺资源而造成的一种僵局。当进程或者线程处于这种僵持状态,若无外力作用,它们将无法再向前推进。死锁的存在是因为有资源获取环的存在。 二、死锁检测实现的原理 资源...

    操作系统死锁问题

    本文将围绕“操作系统死锁问题”这一主题,深入探讨进程死锁的检测方法之一——通过资源分配图的化简来判断是否存在死锁。 #### 二、死锁的基本概念 死锁是指两个或多个并发进程在执行过程中,由于竞争资源或者彼此...

    sqlserver死锁处理

    通过上述存储过程,我们不仅可以检测 SQL Server 中的死锁情况,还可以根据实际情况选择是否自动终止导致死锁的事务。这对于及时发现并解决问题具有重要的意义。当然,在实际应用中还需要结合具体情况,综合考虑各种...

    操作系统实验报告--模拟死锁避免程序

    - `Init()`:负责初始化过程,包括读取用户输入的进程数、资源数等,并存储在相应的数组中。 - `Safe()`:使用银行家算法检测系统是否处于安全状态。 - `Bank()`:处理进程资源分配请求的过程。 3. **主函数`...

    操作系统实验三预防进程死锁的银行家算法.pdf

    本实验报告的主要目的是通过设计程序模拟预防进程死锁的银行家算法的工作过程,以加深对进程死锁的理解,进一步掌握进程资源的分配、死锁的检测和安全序列的生成方法。 银行家算法是一种用于避免死锁的算法,通过该...

    死锁的检测和预防实验报告

    本实验报告主要探讨了操作系统中关于死锁的检测和预防问题,通过使用C++编程语言实现银行家算法,以模拟进程资源分配的过程,从而避免死锁的发生。实验旨在帮助学生深入理解并发执行的进程以及死锁的概念,并通过...

    分析SQL Server 数据库中的死锁

    这个存储过程通过分析`sysprocesses`表中的数据,返回包含死锁事务的SPID(会话进程ID)和被阻塞的SPID,以及它们正在执行的SQL语句,便于快速定位问题。 #### 存储过程的使用 一旦创建了`sp_who_lock`存储过程,...

    操作系统死锁实验报告

    在实验中,定义了一个名为`Bank`的数据结构,包含了四个矩阵:`Available`表示当前可用资源,`Max`记录每个进程的最大资源需求,`Allocation`存储已分配的资源,以及`Need`表示每个进程还需要的资源。通过`...

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

    本文将详细介绍如何使用`sp_who_lock`存储过程来检测和分析SQL Server数据库中的死锁。 `sp_who_lock`是一个自定义的存储过程,用于获取当前系统中发生死锁或阻塞的信息。这个过程比内置的`sp_who`和`sp_who2`...

    死锁的检测与分析系统的设计

    本设计的主要目标是通过模拟死锁检测算法,深入了解死锁检测过程中所涉及的数据结构设计及其应用,尤其是资源分配图在死锁检测中的重要作用。具体而言,设计需满足以下几点要求: 1. **模拟算法**:设计并实现一种...

    sqlserver进程死锁关闭的方法

    - 一旦找到SPID,可以通过`sp_who2`系统存储过程获取更多关于该进程的信息,包括主机名、登录名、状态、命令等。这有助于定位导致死锁的具体操作。 3. **结束死锁进程**: - 如果无法通过其他方式解决死锁,可以...

Global site tag (gtag.js) - Google Analytics