dataiotech Labs
dbaguidedbaguideDBAdataxtoolsdataopsphere
Runbooks Library/sqlserver/#29
Runbook #29
sqlserver
LockingSEV1 · CRITICAL OUTAGE15-30 dakika / 15-30 minssysadmin / CONTROL SERVER / VIEW SERVER STATE

SQL Server Deadlock Investigation: From system_health Graph to Root Cause

Analyzes error 1205 using the deadlock graph, distinguishes victim from the lock cycle and prevents recurrence through access-order and index fixes.

Related Metrics:M29
Related Scripts:S48S41
#deadlock#error-1205#system_health#extended-events

Operational Safety & Risk Notice

This runbook contains operational intervention steps; several are write-impacting (KILL, terminate, DROP, RESIZE). Verify in a staging environment first, and apply sequentially in production with verification.

🟢 Salt Okunur (Read-Only)·🟡 Geri Alınabilir (Reversible)·🔴 Yüksek Etkili / Geri Alınamaz (High Impact)

1. Symptom & Signals

- Uygulama `Transaction (Process ID ...) was deadlocked on lock resources ... (Error 1205)` hatası alır; M29 artar.

- **Deadlock, uzun bloklamadan farklıdır:** SQL Server döngüyü tespit edip bir işlemi victim seçer ve geri alır; anlık `sys.dm_exec_requests` sorgusu olayı kaçırabilir.

2. Business & Technical Impact

Victim transaction geri alınır; uygulamada yeniden denenmeyen işlem başarısız olur. Sık tekrarlanırsa sipariş/ödeme gibi akışlarda veri işleme aksar.

3. Diagnosis & Root-Cause Analysis

🟢 Read-Only1. S48'e karşılık `system_health` Extended Events ring buffer'ından deadlock XML'ini okuyun (SQL Server 2012+, ring buffer geçmişi sınırlıdır):
sql
;WITH targets AS (
  SELECT CAST(st.target_data AS xml) AS target_xml
  FROM sys.dm_xe_session_targets AS st
  JOIN sys.dm_xe_sessions AS ses ON ses.address = st.event_session_address
  WHERE ses.name = N'system_health' AND st.target_name = N'ring_buffer'
)
SELECT evt.node.value('(@timestamp)[1]', 'datetime2') AS event_utc,
       evt.node.query('(data[@name="xml_report"]/value/deadlock)[1]') AS deadlock_xml
FROM targets
CROSS APPLY target_xml.nodes('/RingBufferTarget/event[@name="xml_deadlock_report"]') AS evt(node)
ORDER BY event_utc DESC;

Ring buffer boşsa `system_health` event-file hedefini SSMS ile açın; buffer taşmış olabilir. Gerekli yetki SQL Server 2022'de `VIEW SERVER PERFORMANCE STATE`, eski sürümlerde genellikle `VIEW SERVER STATE`.

🟢 Read-Only2. Grafikte `victim-list`, `process-list`, `resource-list` öğelerini ve **her iki** oturumun sorgu/nesne erişim sırasını inceleyin. Victim yalnızca *kaybeden* oturumdur; kök neden çoğunlukla iki transaction'ın ters sırada nesne kilitlemesidir.
🟢 Read-Only3. S41 ile **o anki** bloklamaya da bakın, fakat bitmiş deadlock'u orada aramayın. Aynı tablo ve SQL kalıbı tekrarlanıyor mu, indeks taraması geniş kilit kapsamı yaratıyor mu inceleyin.

4. Remediation & Action Plan

🟡 Reversible1. Victim işlem **idempotent ise**, uygulama katmanında sınırlı sayıda, jitter/backoff ile `1205` için transaction'ın **tamamını** yeniden deneyin; sadece son SQL ifadesini tekrar etmek tutarsızlık yaratabilir.
🟡 Reversible2. İki iş akışının tablo/satır erişim sırasını aynı hale getirin, transaction süresini kısaltın, gerekliyse indeks ekleyerek taranan/kilitlenen satır sayısını azaltın. İndeks değişikliğinin yazma maliyetini test edin.
🟡 Reversible3. Salt okuma ile yazma deadlock'ları baskınsa `READ_COMMITTED_SNAPSHOT` değerlendirin; semantik ve TempDB yükü değişir, önce test edin (ilgili runbook: `mssql-blocking-chain`).
🔴 HIGH RISK / IRREVERSIBLE4. `DEADLOCK_PRIORITY` victim seçimini değiştirebilir, **deadlock'u çözmez**; kritik iş mantığı kararı olmadan ayarlamayın. Karşı oturumu `KILL` ile körlemesine sonlandırmayın, SQL Server döngüyü zaten çözer.

5. **Yapmayın:** Genel `NOLOCK` eklemek kirli/eksik okuma riskini artırır; kalıcı çözüm değildir.

5. Verification & Health Checks

- M29 baseline'a indi; aynı deadlock imzası artık system_health'te tekrarlanmıyor.

- Uygulama tekrar denemelerinden sonra işlem tam ve tekil gerçekleşiyor; testte yarış koşulu tekrar üretilemiyor.

6. Rollback & Contingency Plan

- Uygulama erişim sırası/retry değişikliklerini deployment geri alımıyla döndürün.

- Yeni indeks geri alınabilir ancak kaldırmadan önce eski sorgu planlarını karşılaştırın; RCSI değişikliğinin geri alınması uygulama davranışını tekrar değiştirebilir.

More SQLSERVER Runbooks