天天看點

SQL SERVER 檢視近期死鎖

SQL SERVER 檢視近期死鎖

在項目運作的過程中,死鎖不可能完全避免,但要盡可能減少死鎖的出現,

産生死鎖的原因主要是:

1,系統資源不足。

2,程序運作推進的順序不合适。

3,資源配置設定不當等。

産生死鎖的四個必要條件:

  • 互斥條件:一個資源每次隻能被一個程序使用,即在一段時間内某資源僅為一個程序所占有。此時若有其他程序請求該資源,則請求程序隻能等待。
  • 請求與保持條件:程序已經保持了至少一個資源,但又提出了新的資源請求時,該資源已被其他程序占有,此時請求程序被阻塞,但對自己已獲得的資源保持不放。
  • 不可剝奪條件:已經配置設定的資源不能從相應的程序中被強制地剝奪。
  • 循環等待條件: 系統中若幹程序組成環路,該環路中每個程序都在等待相鄰程序正占用的資源。

    這四個條件是死鎖的必要條件,隻要系統發生死鎖,這些條件必然成立,而隻要上述條件之一不滿足,就不會發生死鎖。

排查死鎖是有哪個SQL導緻的,死鎖産生後即消失,很難讓使用者重制死鎖問題,雖然可以從日志中分析死鎖,但非常繁瑣,可以利用下面的SQL SERVER 擴充事件,查詢曆史死鎖,查詢原因:

複制代碼

/

  • 檢查近期死鎖;定位到具體的對象。友善排查問題;

DECLARE @SessionName SysName

SELECT @SessionName = 'system_health'

IF OBJECT_ID('tempdb..#Events') IS NOT NULL BEGIN

DROP TABLE #Events           

END

DECLARE @Target_File NVarChar(1000)

, @Target_Dir NVarChar(1000)
, @Target_File_WildCard NVarChar(1000)
           

SELECT @Target_File = CAST(t.target_data as XML).value('EventFileTarget[1]/File[1]/@name', 'NVARCHAR(256)')

FROM sys.dm_xe_session_targets t

INNER JOIN sys.dm_xe_sessions s ON s.address = t.event_session_address           

WHERE s.name = @SessionName

AND t.target_name = 'event_file'
           

SELECT @Target_Dir = LEFT(@Target_File, Len(@Target_File) - CHARINDEX('', REVERSE(@Target_File)))

SELECT @Target_File_WildCard = @Target_Dir + '' + @SessionName + '_*.xel'

--Keep this as a separate table because it's called twice in the next query. You don't want this running twice.

SELECT DeadlockGraph = CAST(event_data AS XML)

, DeadlockID = Row_Number() OVER(ORDER BY file_name, file_offset)           

INTO #Events

FROM sys.fn_xe_file_target_read_file(@Target_File_WildCard, null, null, null) AS F

WHERE event_data like 'https://www.cnblogs.com/lvzf/p/10571210.html