zoukankan      html  css  js  c++  java
  • 解决死锁SQL

    USE [master]
    GO
    /****** Object: StoredProcedure [dbo].[p_lockinfo] Script Date: 04/03/2014 15:12:40 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    ALTER proc [dbo].[p_lockinfo]
    @kill_lock_spid bit=1, --是否杀掉死锁的进程,1 杀掉, 0 仅显示
    @show_spid_if_nolock bit=1 --如果没有死锁的进程,是否显示正常进程信息,1 显示,0 不显示
    as
    --exec master.dbo.p_lockinfo 0,0 ---显示死锁的进程,不显示正常的进程
    --KILL 52
    --exec master.dbo.p_lockinfo 1,0 ---杀死死锁的进程,不显示正常的进程
    declare @count int,@s nvarchar(4000),@i int
    select id=identity(int,1,1),标志,
    进程ID=spid,线程ID=kpid,块进程ID=blocked,数据库ID=dbid,
    数据库名=db_name(dbid),用户ID=uid,用户名=loginame,累计CPU时间=cpu,
    登陆时间=login_time,打开事务数=open_tran, 进程状态=status,
    工作站名=hostname,应用程序名=program_name,工作站进程ID=hostprocess,
    域名=nt_domain,网卡地址=net_address
    into #t from(
    select 标志='死锁的进程',
    spid,kpid,a.blocked,dbid,uid,loginame,cpu,login_time,open_tran,
    status,hostname,program_name,hostprocess,nt_domain,net_address,
    s1=a.spid,s2=0
    from master..sysprocesses a join (
    select blocked from master..sysprocesses group by blocked
    )b on a.spid=b.blocked where a.blocked=0
    union all
    select '|_牺牲品_>',
    spid,kpid,blocked,dbid,uid,loginame,cpu,login_time,open_tran,
    status,hostname,program_name,hostprocess,nt_domain,net_address,
    s1=blocked,s2=1
    from master..sysprocesses a where blocked<>0
    )a order by s1,s2

    select @count=@@rowcount,@i=1

    if @count=0 and @show_spid_if_nolock=1
    begin
    insert #t
    select 标志='正常的进程',
    spid,kpid,blocked,dbid,db_name(dbid),uid,loginame,cpu,login_time,
    open_tran,status,hostname,program_name,hostprocess,nt_domain,net_address
    from master..sysprocesses
    set @count=@@rowcount
    end

    if @count>0
    begin
    create table #t1(id int identity(1,1),a nvarchar(30),b Int,EventInfo TEXT)
    if @kill_lock_spid=1
    begin
    declare @spid varchar(10),@标志 varchar(10)
    while @i<=@count
    begin
    select @spid=进程ID,@标志=标志 from #t WHERE id=@i
    insert #t1 exec('dbcc inputbuffer('+@spid+')')
    if @标志='死锁的进程' exec('kill '+@spid)
    set @i=@i+1
    end
    end
    else
    while @i<=@count
    begin
    select @s='dbcc inputbuffer('+cast(进程ID as varchar)+')' from #t WHERE id=@i
    insert #t1 exec(@s)
    set @i=@i+1
    end
    select a.*,进程的SQL语句=b.EventInfo
    from #t a join #t1 b on a.id=b.id
    end

  • 相关阅读:
    消息中间件(一)MQ详解及四大MQ比较
    SIP协议
    PAT (Basic Level) Practice 1008 数组元素循环右移问题
    LeetCode-Algorithms 1. 两数之和
    PAT (Basic Level) Practice 1040 有几个PAT
    PAT (Basic Level) Practice 1023 组个最小数
    PAT (Basic Level) Practice 1021 个位数统计
    PAT (Basic Level) Practice 1007 素数对猜想
    PAT (Basic Level) Practice 1006 换个格式输出整数
    PAT (Basic Level) Practice 1004 成绩排名
  • 原文地址:https://www.cnblogs.com/wolf12/p/3643085.html
Copyright © 2011-2022 走看看