## 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.
Návod
Ako vytiahnuť a čítať deadlock graph
Deadlocky zo system_health Extended Events a ako v grafe nájsť obeť a príčinu.
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;