数据库的表总是死锁,每次没办法了我都得重启数据库。是使用了不少存储过程,我该从哪里查起呢?

解决方案 »

  1.   

    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
    exec sp_who2
      

  2.   

    另外打开你的profiler 监控下SQL
      

  3.   

    杀死锁进程的语句:
    declare @s nvarchar(100)
    declare tb cursor local
    for
    select N'kill '+rtrim(spid)
    from sysprocesses
    where status=N'sleeping'
    and spid>=50
    open tb
    fetch tb into @s
    while @@fetch_status=0
    begin
    exec(@s)
    fetch tb into @s
    end
    close tb
    deallocate tb  
      

  4.   

    最简单的方法是用SQL SERVER PROFILER1.打开Profiler,新建跟踪。在“事件选择”中,选择”deadlock graph死锁图/lock:acquired锁:需求/lock:escalation锁:升级/lock:Released锁:释放(都在Locks下)“,"SQL:BatchStarting(TSQL下)"和"SP:Starting(存储过程下)"。2.“显示所有列”,将“EventSequence”选中,以保证事件的执行序列正确。3.启动跟踪,然后查看其中的Deadlock:graph事件,SQL会以图形化的方式,将死锁情况清晰的显示出来。记得结贴哦
      

  5.   

    Sorry, 是我的错,我以前都是在测试环境下使用死锁跟踪的。没注意到跟踪死锁会创建大量的负载。确实,死锁跟踪不建议在生产环境下或繁忙的情况下使用,建议脱机或在测试环境下使用。