`

关于死锁的两条过程

阅读更多
exec master.dbo.sp_who_lock --查看当前死锁进程

exec master.dbo.p_killspid ytsafety--杀掉引起死锁的进程



sp_who_lock如下:

SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
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



GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO



p_killspid 如下:

SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
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
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO



ALTER   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
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO

分享到:
评论

相关推荐

    查看阻塞和死锁

    在数据库管理领域,阻塞和死锁是两个常见的问题,它们可以严重影响数据库系统的性能和稳定性。本文将基于提供的存储过程“sp_who_lock”来深入探讨如何检测和处理阻塞和死锁的情况。 ### 阻塞(Blocking) 阻塞是...

    查看数据库死锁信息

    死锁指的是两个或多个事务在执行过程中,因争夺资源而造成的一种相互等待的现象,若无外力干涉它们将无法继续执行。本篇文章将详细讲解如何查看和分析MySQL数据库中的死锁信息。 标题所提及的"查看数据库死锁信息...

    Oracle查询死锁表

    死锁是指两个或多个事务在执行过程中因争夺资源而造成的一种僵局状态,若不及时处理,将直接影响到系统的性能和稳定性。本文将围绕“Oracle查询死锁表”的主题展开详细讨论,旨在帮助数据库管理员更好地理解和掌握...

    数据库 死锁的解决

    死锁的根本原因在于资源竞争,特别是当两个或多个进程试图以不同的顺序锁定同一组资源时,便可能导致死锁的发生。 **表现一:** 一种典型的死锁场景发生在两个用户对同一组资源进行访问时: - **用户A** 首先获取...

    mysql死锁分析

    在MySQL的使用过程中,死锁是一个较为常见的现象,尤其是在并发量较大的应用场景下。死锁的发生往往会给系统带来不可预知的影响,严重时甚至会导致整个数据库服务不可用。对于MySQL/InnoDB数据库而言,了解死锁的...

    一次mysql死锁的排查过程

    死锁是指两个或多个事务在执行过程中,因争夺资源而造成的一种相互等待的现象,若无外力干涉它们都将无法继续执行。MySQL中的InnoDB存储引擎提供了事务的ACID特性,其中包括了事务隔离级别,如Repeatable-Read(可...

    死锁的检测与解除

    死锁是多道程序环境下的一种特殊现象,指的是两个或两个以上的进程在执行过程中,由于竞争资源或者彼此通信而造成的一种相互等待的现象。若无外力作用,这些进程都无法继续执行。 #### 二、死锁产生的四个必要条件 ...

    SQLServer死锁

    图中展示了两个任务 T1 和 T2,分别持有资源 R1 和 R2,并且各自请求对方所持有的资源,满足了死锁的四个必要条件: 1. 互斥:资源 S1 和 S2 不能被共享,同一时间只能由一个任务使用。 2. 请求与保持条件: T1 ...

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

    死锁是指两个或多个并发进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力干涉,它们都将无法继续执行。本项目是关于使用C++语言在VC++环境下实现死锁检测算法的一个实例。 首先,我们需要理解...

    这六个 MySQL 死锁案例,能让你理解死锁的原因!.doc

    在 MySQL 中,死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象。死锁的产生原因是由于两个或两个以上的 Session 加锁的顺序不一致。解决死锁问题的关键就是让不同的 Session 加锁...

    oracle如何解除死锁

    死锁是指两个或多个事务在执行过程中,因争夺资源而造成的一种僵局现象,在这种状态下,每个事务都在等待另一个事务释放资源,但其他事务又都在等待前者释放资源,从而导致所有涉及的事务都无法继续执行下去。...

    oracle查找死锁

    在Oracle数据库的日常管理和维护过程中,死锁是一个常见的问题。当两个或多个会话互相等待对方释放资源时就会发生死锁,这会导致相关事务无法继续执行,甚至可能会影响到整个数据库系统的性能。因此,学会如何有效...

    Oracle数据库死锁查询语句

    Oracle数据库死锁是数据库系统中常见的问题,它发生在两个或多个事务在执行过程中,因争夺资源而造成的一种相互等待的现象。当这种情况发生时,如果没有外力干预,这些事务都将无法继续执行,形成一种僵局。了解如何...

    一个最不可思议的MySQL死锁分析1

    如果在删除过程中,事务发现需要等待其他事务释放锁,就会进入等待状态,从而可能形成死锁。 死锁预防策略是避免这种情况的关键。一种常见的策略是使用较低的事务隔离级别,如RC(Read Committed),以减少锁定的...

    数据库死锁案例

    **死锁**定义为多个工作流在执行过程中,由于竞争共享资源而形成的相互等待现象,这种状态需要外部力量介入才能打破。死锁的发生必须满足以下四个条件: 1. **互斥条件**:一个资源在同一时间只能被一个事务独占...

    SQLSERVER死锁总结

    死锁的排查可以使用 SQL Server 的系统存储过程 sp_who 和 sp_lock,查看当前数据库中的锁情况。使用 objectID(@objID)(SQL Server 2005)/ object_name(@objID)(SqlServer 2000) 可以查看哪个资源被锁,用 dbcc ld(@...

    大牛出手MySQL死锁深入分析

    案例中提到,一个不可思议的死锁场景,即使两个并发事务删除的是同一条记录,根据常规理解,不应该发生死锁。但事实却相反,经过初步分析,确实发生了死锁。这说明,数据库在并发执行时的情况可能比想象中要复杂。 ...

    oracle事务与死锁

    死锁是并发数据库操作中的一种特殊情况,当多个事务在执行过程中因争夺资源而互相等待对方释放资源,导致事务都无法继续执行的状态。在Oracle中,死锁通常发生在事务试图更新或删除数据库表中同一列的数据时。如果两...

Global site tag (gtag.js) - Google Analytics