SQL Server 2008 har flera sätt att identifiera processer och frågor som är involverade i dödläge.
-
Om låsningar är lätta att reproducera, är frekvensen högre och du kan profilera SQL-servern (du har åtkomst- och prestandakostnaden på servern när profiler är aktiverad) med hjälp av SQL Profiler kommer du att ge dig en snygg grafisk bild av dödläge. Den här sidan har all information du måste använda dödlägesdiagramhttp://sqlmag.com/ database-performance-tuning/gathering-deadlock-information-deadlock-graph
-
Oftast är det svårt att återskapa dödlägen, eller så händer de i produktionsmiljöer där vi inte vill koppla Profiler till den och påverka prestandan.
Jag skulle använda den här frågan för att få dödlägen:
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
Jag skulle INTE gå i riktning mot att använda (NOLOCK) för att fixa dödläge. Det är en hal backe och döljer det ursprungliga problemet.