`
baobeituping
  • 浏览: 1064786 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

编写的一个存储过程,来检测数据库死锁进程

SQL 
阅读更多

 /*--------------------------------------------------------------------------------------- 
 
名称:sp_who_lock 
功能:用来检测是否有死锁的进程,如果有,把造成死锁的进程ID,HostName, ProgramName 和执行的SQL 
      语句保存到表jobcn_boss_operlog.dbo.DeadLockLog 
 
参数: @SaveToTable 用来标示是否保存死锁进程到表jobcn_boss_operlog.dbo.DeadLockLog 
 1 是, 0 否, 默认 = 0 
 
     @PrintRootCauseOnly 是否只显示造成死锁的根源进程信息 
        1 只显示死锁根源进程 0 除显示死锁根源进程外,还显示被阻塞的进程, 默认 = 0  
 
时间:2010-10-11 
版本:1.0 
修改: 
 
---------------------------------------------------------------------------------------*/ 
 
CREATE  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   --写入引起数据库死锁的进程号到jobcn_boss_operlog.dbo.DeadLockLog 
   insert into jobcn_boss_operlog.dbo.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 
  
  
 

分享到:
评论

相关推荐

    数据库 死锁的解决

    例如,在编写存储过程时,可以明确指定固定的锁定顺序,如: - 如果某个过程(proc1)需要按顺序锁定 `zltab`、`z2tab` 和 `z3tab`,则所有相关的其他过程(如 proc2)也应遵循相同的顺序。 2. **合理选择索引类型...

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

    在SQL Server 2000中,可以通过编写存储过程来自动检测并杀死死锁进程。存储过程会查询系统表`sysprocesses`来获取当前的进程信息,并识别出死锁的进程。 4. 存储过程的创建与逻辑 文档中描述的`sp_killlock`是一...

    sqlserver死锁处理

    - **使用系统存储过程**:可以编写自定义的存储过程来查询当前的锁信息,从而识别出可能存在的死锁情况。 本案例中提供的存储过程 `p_lockinfo` 就是一种有效的检测死锁的方法。该存储过程通过查询 `sysprocesses` ...

    程序进程条 delphi 源码 数据库 多线程

    - 使用多线程可以避免阻塞主线程,提高用户体验,例如,一个线程负责执行耗时操作,另一个线程更新进程条,保持界面的响应性。 6. **并发和同步**: - 在多线程环境下,必须注意线程间的同步问题,防止数据竞争和...

    浅析SQL SERVER死锁产生的原因及解决 (1).pdf

    4. 死锁分析工具:使用SQL Server提供的系统存储过程sp_who, sp_lock, sp_spaceused等来分析当前系统的活动进程和锁情况。 5. 优化查询和索引:通过优化查询语句和确保合理的索引存在,减少不必要的锁和锁升级事件。...

    国产数据库 达梦数据库管理工具

    达梦数据库管理工具是专为国产数据库达梦设计的一款高效、易用的管理软件,它提供了全面的数据库管理和维护功能,旨在帮助用户更好地管理和优化他们的数据存储系统。这款工具不仅适用于数据库管理员,也适合开发人员...

    查看oracle进程,杀进程pb源程序

    总的来说,"查看Oracle进程,杀进程pb源程序"是一个集数据库监控、诊断和操作于一体的工具,对于DBA(数据库管理员)和系统运维人员来说极具价值。通过PB9,我们可以便捷地获取Oracle的运行状况,及时发现并解决潜在...

    银行家算法 死锁演示

    在C语言中实现银行家算法,通常需要创建数据结构来存储上述信息,并编写相应的函数来处理请求、安全检查和资源释放。代码会包括用于初始化、请求、检查安全性和释放资源的函数。同时,为了模拟并发环境,可能还需要...

    多进程爬取在线课程并存入MySQL数据库.zip

    在Python编程领域,多进程爬取在线课程并存入MySQL数据库是一种常见的数据获取与存储方法。这个项目涉及到了网络爬虫、多进程处理以及数据库操作等核心知识点,下面将逐一详细解析。 首先,网络爬虫是自动抓取...

    银行家算法C#版-自动连access数据库

    总的来说,这个项目提供了一个实用的示例,将理论上的银行家算法与实际的数据库操作相结合,对于学习操作系统和C#编程的初学者来说,具有很高的参考价值。同时,对于已经有一定经验的开发者,也可以从中借鉴如何高效...

    cpp-DeepDataBase是一个使用B树索引实现的关系数据库引擎

    **正文** cpp-DeepDataBase是一...对于学习数据库原理、C++编程以及数据结构和算法的人来说,这是一个极好的实践项目。通过研究和使用cpp-DeepDataBase,开发者可以深入理解数据库引擎的工作原理,并提升自己的技能。

    使用JAVA内存数据库h2database性能优化

    控制台模式则允许独立于应用程序运行,提供了一个Web客户端管理工具,可以通过执行SQL语句和查看模式、表来进行数据库管理。 启动h2database嵌入模式通常涉及将h2database的jar文件添加到项目的类路径中,然后通过...

    数据库实验报告

    3. 进程调度的对象是就绪队列中的进程,任务是选择一个进程占用CPU,这涉及到操作系统的调度策略。 4. 动态重定位是一种支持程序浮动的地址转换机制,它允许程序在内存中的位置改变而不影响其执行。 5. 最优适应分配...

    计算机软件-商业源码-261 提示数据库正在使用.zip

    标题中的“261 提示数据库正在使用”很可能是指在操作数据库时遇到的一个特定错误或警告消息。这个错误通常出现在尝试访问或者修改数据库时,发现数据库已经被其他进程占用,因此无法立即执行请求的操作。在软件开发...

    ORACLE数据库实例视频教程03

    6. **存储过程和函数**:学习编写PL/SQL代码,创建存储过程和函数,实现业务逻辑和数据处理。 7. **触发器和游标**:了解如何使用触发器来自动执行特定操作,以及游标在处理单条或多条记录时的作用。 8. **数据库...

    数据库维护工作手册.docx

    - 重建无效或损坏的索引、触发器、存储过程等。 - **碎片回收** - 使用`ANALYZE`或`REORGANIZE`命令对表进行整理,减少碎片。 - **删除不用的数据** - 定期清理过期或不再使用的数据记录。 - **备份恢复** - ...

Global site tag (gtag.js) - Google Analytics