dataiotech Labs
dbaguidedbaguideDBAdataxtoolsdataopsphere
Runbook #29
sqlserver
LockingSEV1 · KRİTİK KESİNTİ15-30 dakika / 15-30 minssysadmin / CONTROL SERVER / VIEW SERVER STATE

SQL Server Deadlock İncelemesi: system_health Grafiğinden Kök Nedene

Error 1205'i deadlock grafiğiyle analiz eder, victim ve kilit döngüsünü ayırır; erişim sırası ve indeks düzeltmeleriyle tekrarı önler.

İlişkili Metrik:M29
İlişkili Script:S48S41
#deadlock#error-1205#system_health#extended-events

Operasyonel Güvenlik ve Risk Uyarısı

Bu runbook müdahale adımları içerir; birçok adım yazma etkilidir (KILL, terminate, DROP, RESIZE). Önce test ortamında deneyin, üretimde adımları sırayla ve doğrulayarak uygulayın.

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

1. Belirti / Symptom

- 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. Etki / 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. Teşhis / Diagnosis

🟢 Salt Okunur1. 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`.

🟢 Salt Okunur2. 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.
🟢 Salt Okunur3. 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. Müdahale / Response

🟡 Geri Alınabilir1. 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.
🟡 Geri Alınabilir2. İ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.
🟡 Geri Alınabilir3. 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`).
🔴 YÜKSEK RİSK / GERİ ALINAMAZ4. `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. Doğrulama / Verification

- 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. Geri Alma / Rollback

- 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.

Diğer SQLSERVER Runbook'ları