SQL Server 2008 offre diversi modi per identificare i processi e le query coinvolti nel deadlock.
-
Se i deadlock sono facili da riprodurre, la frequenza è più alta e puoi profilare il server SQL (hai l'accesso e il costo delle prestazioni sul server quando il profiler è abilitato) usando SQL Profiler ti darà una bella vista grafica del deadlock. Questa pagina ha tutte le informazioni di cui hai bisogno è necessario utilizzare i grafici deadlockhttp://sqlmag.com/ database-performance-tuning/gathering-deadlock-information-deadlock-graph
-
La maggior parte delle volte la riproduzione dei deadlock è difficile, oppure si verificano in un ambiente di produzione in cui non vogliamo collegare Profiler ad esso e influire sulle prestazioni.
Userei questa query per ottenere i deadlock:
SELECT
xed.value('@timestamp', 'datetime') as Creation_Date,
xed.query('.') AS Extend_Event
FROM
(
SELECT CAST([target_data] AS XML) AS Target_Data
FROM sys.dm_xe_session_targets AS xt
INNER JOIN sys.dm_xe_sessions AS xs
ON xs.address = xt.event_session_address
WHERE xs.name = N'system_health'
AND xt.target_name = N'ring_buffer'
) AS XML_Data
CROSS APPLY Target_Data.nodes('RingBufferTarget/event[@name="xml_deadlock_report"]') AS XEventData(xed)
ORDER BY Creation_Date DESC
NON andrei nella direzione di utilizzare (NOLOCK) per correggere i deadlock. Questa è una pendenza scivolosa e nasconde il problema originale.