• 如何知道是哪个进程造成死锁?如何把这个进程杀掉?


    --转贴:

    MSSQL(查找死锁):

    use master

    go

    declare @spid int,@bl int

    DECLARE s_cur CURSOR FOR 

    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

    OPEN s_cur

    FETCH NEXT FROM s_cur INTO @spid,@bl

    WHILE @@FETCH_STATUS = 0

    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 )

    FETCH NEXT FROM s_cur INTO @spid,@bl

    end

    CLOSE s_cur

    DEALLOCATE s_cur

     

    --邹建的

    create proc sp_lockinfo

    @kill_lock_spid bit=1,      --是否杀掉阻塞的进程,1 杀掉, 0 仅显示

    @show_spid_if_nolock bit=1, --如果没有阻塞的进程,是否显示正常进程信息,1 显示,0 不显示

    @dbname sysname=''          --如果为空,则查询所有的库,如果为null,则查询当前库,否则查询指定库

    as

    set nocount on

    declare @count int,@s nvarchar(2000),@dbid int

    if @dbname='' set @dbid=db_id() else set @dbid=db_id(@dbname)

    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

    where blocked>0

    and(@dbid is null or dbid=@dbid)

    group by blocked

    )b on a.spid=b.blocked

    where a.blocked=0

    and(@dbid is null or dbid=@dbid)

    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=spid

    from master..sysprocesses a

    where blocked<>0

    and(@dbid is null or dbid=@dbid)

    )a order by s1,s2

    select @count=@@rowcount

    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

    where @dbid is null or dbid=@dbid

    order by spid

    set @count=@@rowcount

    end

    if @count>0

    begin

    create table #t1(id int identity(1,1),a nvarchar(30),b Int,EventInfo nvarchar(255))

    declare tb cursor local

    for

    select N'insert #t1 exec(''dbcc inputbuffer('+rtrim(进程ID)+')'')

    if @@rowcount=0 insert #t1(a) values(null)

    '+case when @kill_lock_spid=1 and 标志=N'阻塞的进程'

    then 'kill '+rtrim(进程ID) else '' end

    from #t

    open tb

    fetch tb into @s

    while @@fetch_status=0

    begin

    exec(@s)

    fetch tb into @s

    end

    close tb

    deallocate tb

    select a.*,进程的SQL语句=b.EventInfo

    from #t a join #t1 b on a.id=b.id

    order by a.ID

    end

    set nocount off

    go

  • 相关阅读:
    LeetCode剑指Offer03
    腾讯软件开发客户端开发实习生二面
    luogu P2801 教主的魔法 分块
    luogu P3396 哈希冲突 根号算法
    luogu P1972 [SDOI2009]HH的项链 树状数组
    BZOJ 2440: [中山市选2011]完全平方数 莫比乌斯函数 容斥原理 二分答案
    柳阴直,烟里丝丝弄碧
    卡通别名
    它们
    高中随笔
  • 原文地址:https://www.cnblogs.com/martian6125/p/9631278.html
Copyright © 2020-2023  润新知