Preskočiť na obsah
Návod

Ako vytiahnuť a čítať deadlock graph

Deadlocky zo system_health Extended Events a ako v grafe nájsť obeť a príčinu.

1 min čítania 3 kroky SQL Server 2012+
## Kedy to použiť
Aplikácia hlási **Msg 1205** – *Transaction was deadlocked… and has been chosen as the deadlock victim.*
Session `system_health` beží na každom SQL Serveri štandardne a deadlocky zachytáva automaticky.

## Postup
1. Spusti dotaz nižšie – vráti posledné deadlocky ako XML.
2. Klikni na `deadlock_graph`, ulož ako **.xdl** a otvor v SSMS – uvidíš graf.
3. V grafe hľadaj:
   - **preškrtnutý proces** = obeť (*victim*),
   - **resource nodes** – ktoré objekty / indexy / kľúče sa bili,
   - `isolationlevel` a `lockMode` (S, U, X, IX…).

## Typické príčiny
| Vzor | Liek |
|---|---|
| Rôzne poradie prístupu k tabuľkám | rovnaké poradie v kóde |
| Key lookup + update | covering index |
| `SERIALIZABLE` z ORM | znížiť izoláciu / RCSI |

> Tip: zapni `READ_COMMITTED_SNAPSHOT` – odstráni väčšinu reader/writer deadlockov.
ako-vytiahnut-a-citat-deadlock-graph.sql 10 riadkov · T-SQL
Parametre skriptu doplň a kopíruj hotový skript
SELECT  xed.value('@timestamp', 'datetime2(3)') AS deadlock_time_utc,
        xed.query('.')                           AS deadlock_graph
FROM (
    SELECT CAST(target_data AS xml) AS target_data
    FROM   sys.dm_xe_session_targets AS st
    JOIN   sys.dm_xe_sessions        AS s ON s.address = st.event_session_address
    WHERE  s.name = 'system_health' AND st.target_name = 'ring_buffer'
) AS d
CROSS APPLY d.target_data.nodes('RingBufferTarget/event[@name="xml_deadlock_report"]') AS x(xed)
ORDER BY deadlock_time_utc DESC;