數據庫查詢超級慢,數據庫死鎖的查看與解決

今天幫同事解決問題,頁面報「等待的操做過期」,設置斷點發現數據庫查詢語句處異常(提示:已超過了鎖請求超時時段。),檢查了數據庫一通,發現鏈接數據庫也鏈接不上了,搜了一圈找到解決辦法。留着備用啦sql

首先查出死鎖,可用sql語句
SELECT blocking_session_id '阻塞進程的ID', wait_duration_ms '等待時間(毫秒)', session_id '(會話ID)' FROM sys.dm_os_waiting_tasks數據庫

或者建立如下存儲過程,查詢出來session

USE [master]
GO
/****** Object:  StoredProcedure [dbo].[sp_who_lock]    Script Date: 01/03/2017 10:58:03 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER procedure [dbo].[sp_who_lock]

as

begin

declare @spid int,@bl int,

 @intTransactionCountOnEntry  int,

        @intRowcount    int,

        @intCountProperties   int,

        @intCounter    int



 create table #tmp_lock_who (

 id int identity(1,1),

 spid smallint,

 bl smallint)

 

 IF @@ERROR<>0 RETURN @@ERROR

 

 insert into #tmp_lock_who(spid,bl) 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



 IF @@ERROR<>0 RETURN @@ERROR 

  

-- 找到臨時表的記錄數
 select  @intCountProperties = Count(*),@intCounter = 1

 from #tmp_lock_who

 

 IF @@ERROR<>0 RETURN @@ERROR 

 

 if @intCountProperties=0

  select '如今沒有阻塞和死鎖信息' as message



-- 循環開始
while @intCounter <= @intCountProperties

begin

-- 取第一條記錄
  select  @spid = spid,@bl = bl

  from #tmp_lock_who where Id = @intCounter 

 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 )

 end 



-- 循環指針下移
 set @intCounter = @intCounter + 1

end



drop table #tmp_lock_who



return 0

end

經過以上即可查出死鎖進程ID,執行 kill 死鎖進程ID  便可(kill 63)ide

相關文章
相關標籤/搜索