sqlserver中怎么查詢死鎖源頭

這篇文章將為大家詳細(xì)講解有關(guān)sqlserver中怎么查詢死鎖源頭,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對相關(guān)知識(shí)有一定的了解。

成都網(wǎng)絡(luò)公司-成都網(wǎng)站建設(shè)公司成都創(chuàng)新互聯(lián)十多年經(jīng)驗(yàn)成就非凡,專業(yè)從事成都網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站,成都網(wǎng)頁設(shè)計(jì),成都網(wǎng)頁制作,軟文發(fā)稿,廣告投放平臺(tái)等。十多年來已成功提供全面的成都網(wǎng)站建設(shè)方案,打造行業(yè)特色的成都網(wǎng)站建設(shè)案例,建站熱線:13518219792,我們期待您的來電!

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

代碼如下: 

use mastergodeclare @spid int,@bl intDECLARE s_cur CURSOR FORselect 0 ,blockedfrom (select * from sysprocesses where blocked>0 ) awhere not exists(select * from (select * from sysprocesses where blocked>0 ) bwhere a.blocked=spid)union select spid,blocked from sysprocesses where blocked>0OPEN s_curFETCH NEXT FROM s_cur INTO @spid,@blWHILE @@FETCH_STATUS = 0beginif @spid =0select '引起數(shù)據(jù)庫死鎖的是:'+ CAST(@bl AS VARCHAR(10)) + '進(jìn)程號(hào),其執(zhí)行的SQL語法如下'elseselect '進(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語法如下'DBCC INPUTBUFFER (@bl )FETCH NEXT FROM s_cur INTO @spid,@blendCLOSE s_curDEALLOCATE s_cur

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

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

代碼如下:

 create proc p_lockinfo@kill_lock_spid bit=1, --是否殺掉死鎖的進(jìn)程,1 殺掉, 0 僅顯示@show_spid_if_nolock bit=1 --如果沒有死鎖的進(jìn)程,是否顯示正常進(jìn)程信息,1 顯示,0 不顯示asdeclare @count int,@s nvarchar(1000),@i intselect id=identity(int,1,1),標(biāo)志,進(jìn)程ID=spid,線程ID=kpid,塊進(jìn)程ID=blocked,數(shù)據(jù)庫ID=dbid,數(shù)據(jù)庫名=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_addressinto #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=0from master..sysprocesses a join (select blocked from master..sysprocesses group by blocked)b on a.spid=b.blocked where a.blocked=0union allselect '|_犧牲品_>',spid,kpid,blocked,dbid,uid,loginame,cpu,login_time,open_tran,status,hostname,program_name,hostprocess,nt_domain,net_address,s1=blocked,s2=1from master..sysprocesses a where blocked<>0)a order by s1,s2

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

if @count=0 and @show_spid_if_nolock=1begininsert #tselect 標(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_addressfrom master..sysprocessesset @count=@@rowcountend

if @count>0begincreate table #t1(id int identity(1,1),a nvarchar(30),b Int,EventInfo nvarchar(255))if @kill_lock_spid=1begindeclare @spid varchar(10),@標(biāo)志 varchar(10)while @i<=@countbeginselect @spid=進(jìn)程ID,@標(biāo)志=標(biāo)志 from #t where id=@iinsert #t1 exec('dbcc inputbuffer('+@spid+')')if @標(biāo)志='死鎖的進(jìn)程' exec('kill '+@spid)set @i=@i+1endendelsewhile @i<=@countbeginselect @s='dbcc inputbuffer('+cast(進(jìn)程ID as varchar)+')'from #t where id=@iinsert #t1 exec(@s)set @i=@i+1endselect a.*,進(jìn)程的SQL語句=b.EventInfofrom #t a join #t1 b on a.id=b.idendgo

exec p_lockinfo

關(guān)于sqlserver中怎么查詢死鎖源頭就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。

標(biāo)題名稱:sqlserver中怎么查詢死鎖源頭
鏈接分享:http://bm7419.com/article10/goepgo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信公眾號(hào)、標(biāo)簽優(yōu)化、網(wǎng)站收錄、、手機(jī)網(wǎng)站建設(shè)、品牌網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)公司