zoukankan      html  css  js  c++  java
  • SQL查死锁进程,并结束死锁进程ID,如结束不掉可能是正被使用或占用,查找原因再Kill

    查死锁以及出现锁定的语句及进程ID
    --如果发现死锁进程ID  则可以使用  Kill SPID 的方式终止进程

    CREATE Table #Who(spid int,
        ecid 
    int,
        status 
    nvarchar(50),
        loginname 
    nvarchar(50),
        hostname 
    nvarchar(50),
        blk 
    int,
        dbname 
    nvarchar(50),
        cmd 
    nvarchar(50),
        request_ID 
    int);

    CREATE Table #Lock(spid int,
        dpid 
    int,
        objid 
    int,
        indld 
    int,
        
    [Type] nvarchar(20),
        Resource 
    nvarchar(50),
        Mode 
    nvarchar(10),
        Status 
    nvarchar(10)
    );

    INSERT INTO #Who
        
    EXEC sp_who active  --看哪个引起的阻塞,blk 
    INSERT INTO #Lock
        
    EXEC sp_lock  --看锁住了那个资源id,objid 

    DECLARE @DBName nvarchar(20);
    SET @DBName='IRMManage'

    SELECT #Who.* FROM #Who WHERE dbname=@DBName
    SELECT #Lock.* FROM #Lock
        
    JOIN #Who
            
    ON #Who.spid=#Lock.spid
                
    AND dbname=@DBName;

    --最后发送到SQL Server的语句
    DECLARE crsr Cursor FOR
        
    SELECT blk FROM #Who WHERE dbname=@DBName AND blk<>0;
    DECLARE @blk int;
    open crsr;
    FETCH NEXT FROM crsr INTO @blk;
    WHILE (@@FETCH_STATUS = 0)
    BEGIN;
        
    dbcc inputbuffer(@blk);
        
    FETCH NEXT FROM crsr INTO @blk;
    END;
    close crsr;
    DEALLOCATE crsr;

    --锁定的资源
    SELECT #Who.spid,hostname,objid,[type],mode,object_name(objid) as objName FROM #Lock
        
    JOIN #Who
            
    ON #Who.spid=#Lock.spid
                
    AND dbname=@DBName
        
    WHERE objid<>0;

    DROP Table #Who;
    DROP Table #Lock;
  • 相关阅读:
    ubuntu 无法在终端切换输入法的解决办法
    c代码连接mysql数据库内存泄露的问题
    栈和堆的地址哪个高
    笔试题之union与struct
    笔试题之interface和abstract class之间的区别
    笔试题之C#struct
    c++单例模式的写法
    c++返回引用是否是真的引用
    operator = 为什么要返回*this的应用
    c++ new和delete操作符的重载
  • 原文地址:https://www.cnblogs.com/hanguoji/p/1820294.html
Copyright © 2011-2022 走看看