<button id="47nwr"><dd id="47nwr"><thead id="47nwr"></thead></dd></button>
<tt id="47nwr"><thead id="47nwr"></thead></tt>
    • <dl id="47nwr"><input id="47nwr"></input></dl>
      <menuitem id="47nwr"><small id="47nwr"><meter id="47nwr"></meter></small></menuitem>
      <tt id="47nwr"><dd id="47nwr"><strong id="47nwr"></strong></dd></tt>
    • <button id="47nwr"><big id="47nwr"><pre id="47nwr"></pre></big></button>
        查找sqlserver查詢死鎖源頭的方法 sqlserver死鎖監(jiān)控
        來(lái)源:易賢網(wǎng) 閱讀:3597 次 日期:2014-05-12 15:31:27
        溫馨提示:易賢網(wǎng)小編為您整理了“查找sqlserver查詢死鎖源頭的方法 sqlserver死鎖監(jiān)控”,方便廣大網(wǎng)友查閱!

        查找出SQLServer的死鎖和阻塞的源頭 --查找出SQLServer死鎖和阻塞的源頭

        代碼如下:

        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 '引起數(shù)據(jù)庫(kù)死鎖的是:

        '+ CAST(@bl AS VARCHAR(10)) + '進(jìn)程號(hào),其執(zhí)行的SQL語(yǔ)法如下'

        else

        select '進(jìn)程號(hào)SPID:'+ CAST(@spid AS VARCHAR(10))+ '被' + '

        進(jìn)程號(hào)SPID:'+ CAST(@bl AS VARCHAR(10)) +'阻塞,其當(dāng)前進(jìn)程執(zhí)行的SQL語(yǔ)法如下'

        DBCC INPUTBUFFER (@bl )

        FETCH NEXT FROM s_cur INTO @spid,@bl

        end

        CLOSE s_cur

        DEALLOCATE s_cur

        查看當(dāng)前進(jìn)程,或死鎖進(jìn)程,并能自動(dòng)殺掉死進(jìn)程 --查看當(dāng)前進(jìn)程,或死鎖進(jìn)程,并能自動(dòng)殺掉死進(jìn)程

        因?yàn)槭轻槍?duì)死的,所以如果有死鎖進(jìn)程,只能查看死鎖進(jìn)程。當(dāng)然,你可以通過(guò)參數(shù)控制,不管有沒(méi)有死鎖,都只查看死鎖進(jìn)程。

        復(fù)制代碼 代碼如下:

        create proc p_lockinfo

        @kill_lock_spid bit=1, --是否殺掉死鎖的進(jìn)程,1 殺掉, 0 僅顯示

        @show_spid_if_nolock bit=1 --如果沒(méi)有死鎖的進(jìn)程,是否顯示正常進(jìn)程信息,1 顯示,0 不顯示

        as

        declare @count int,@s nvarchar(1000),@i int

        select id=identity(int,1,1),標(biāo)志,

        進(jìn)程ID=spid,線程ID=kpid,塊進(jìn)程ID=blocked,數(shù)據(jù)庫(kù)ID=dbid,

        數(shù)據(jù)庫(kù)名=db_name(dbid),用戶ID=uid,用戶名=loginame,累計(jì)CPU時(shí)間=cpu,

        登陸時(shí)間=login_time,打開事務(wù)數(shù)=open_tran, 進(jìn)程狀態(tài)=status,

        工作站名=hostname,應(yīng)用程序名=program_name,工作站進(jìn)程ID=hostprocess,

        域名=nt_domain,網(wǎng)卡地址=net_address

        into #t from(

        select 標(biāo)志='死鎖的進(jìn)程',

        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 標(biāo)志='正常的進(jìn)程',

        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 nvarchar(255))

        if @kill_lock_spid=1

        begin

        declare @spid varchar(10),@標(biāo)志 varchar(10)

        while @i<=@count

        begin

        select @spid=進(jìn)程ID,@標(biāo)志=標(biāo)志 from #t where id=@i

        insert #t1 exec('dbcc inputbuffer('+@spid+')')

        if @標(biāo)志='死鎖的進(jìn)程' exec('kill '+@spid)

        set @i=@i+1

        end

        end

        else

        while @i<=@count

        begin

        select @s='dbcc inputbuffer('+cast(進(jìn)程ID as varchar)+')'

        from #t where id=@i

        insert #t1 exec(@s)

        set @i=@i+1

        end

        select a.*,進(jìn)程的SQL語(yǔ)句=b.EventInfo

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

        end

        go

        exec p_lockinfo

        更多信息請(qǐng)查看IT技術(shù)專欄

        更多信息請(qǐng)查看數(shù)據(jù)庫(kù)
        易賢網(wǎng)手機(jī)網(wǎng)站地址:查找sqlserver查詢死鎖源頭的方法 sqlserver死鎖監(jiān)控
        由于各方面情況的不斷調(diào)整與變化,易賢網(wǎng)提供的所有考試信息和咨詢回復(fù)僅供參考,敬請(qǐng)考生以權(quán)威部門公布的正式信息和咨詢?yōu)闇?zhǔn)!
        關(guān)于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡(jiǎn)要咨詢 | 簡(jiǎn)要咨詢須知 | 新媒體/短視頻平臺(tái) | 手機(jī)站點(diǎn)

        版權(quán)所有:易賢網(wǎng)