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