dataiotech Labs
dbaguidedbaguideDBAdataxtoolsdataopsphere
Home/SQL Server/Hata Kodları (Errors)/sqlserver-1205-deadlock-victim
[Teşhis]SQL Server SQL Server 2019 / 2022Advanced
5 dk okuma

SQL Server Error 1205 Deadlock: Grafiği Bulma ve Önleme

SQL Server Error 1205: "Deadlock victim" — Grafiği Nerede Bulurum?

Yazar / Standart:Kıdemli Veritabanı Mimarı & SRE (dataiotech Labs)
Error 1205: Transaction was deadlocked and chosen as the deadlock victim
İlk 60 Saniye Teşhis Protokolü:

Hata mesajı semptomdur, kök neden değildir. Sunucuyu yeniden başlatmadan veya rastgele ayar değiştirmeden önce aşağıdaki "Nedeni ayırt eden tek sorgu"yu çalıştırarak gerçek senaryoyu netleştirin.

▸Belirti

plaintext
Transaction (Process ID 87) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.

SQL Server deadlock grafiğini çoktan kaydetmiştir — system_health genişletilmiş olay oturumu (Extended Events), varsayılan olarak açıktır ve son deadlock'ları ring buffer'da tutar.


▸Grafiği çıkarma

1. En hızlı yol (SSMS): Sunucu → Yönetim → Genişletilmiş Olaylar → system_health → Hedef Verileri Görüntüle. xml_deadlock_report olayını çift tıklayın; grafik görsel olarak açılır.

2. Sorgu ile (otomasyon için):

sql
SELECT CAST(t.target_data AS XML) AS deadlock_xml FROM sys.dm_xe_session_targets t JOIN sys.dm_xe_sessions s ON s.address = t.event_session_address WHERE s.name = 'system_health' AND t.target_name = 'ring_buffer';

▸Grafiği nasıl okuyacaksınız

Grafikte iki (veya daha fazla) işlem ve her birinin beklediği kilit görünür:

  1. 1Kaynak sırası: İki işlem aynı iki nesneye ters sırada mı erişiyor? (En sık neden)
  2. 2Kilit türü: KEY (indeks satırı), PAGE, RANGE veya OBJECT (tablo) mi? OBJECT görüyorsanız kilit yükseltmesi (lock escalation) devreye girmiştir (5000+ satır kilidi tablo kilidine dönmüş).
  3. 3Kurban: Geri alınması en ucuz işlem seçilir. DEADLOCK_PRIORITY ile yönetilebilir.

▸Adım adım çözüm

1. Erişim sırasını standartlaştırın. Kod tarafında tablo erişim sırasını sabitleyin (ör. her zaman Musteri → Siparis → SiparisDetay).

2. Eksik indeksleri bulun. Deadlock grafiğinde RANGE kilidi veya geniş tarama görüyorsanız, WHERE sütununda indeks yoktur.

3. Kilit yükseltmesini sınırlayın. Toplu işlemlerde tablo kilidi oluşuyorsa:

sql
ALTER TABLE dbo.Siparis SET (LOCK_ESCALATION = DISABLE);

4. Kurbana karar verin. Rapor sorgularının ana akışı ezmesini engellemek için:

sql
SET DEADLOCK_PRIORITY LOW; -- raporlama işleminde

5. Sürümleme ile okuma yükünü ayırın. Okuma işlemlerinin yazıcıları kilitlemesini engellemek için RCSI (Read Committed Snapshot Isolation) açın:

sql
ALTER DATABASE uygulama_db SET READ_COMMITTED_SNAPSHOT ON;

▸İlgili Mühendislik Rehberleri ve İç Linkler

SQL Server Diğer Üretim Rehberleri

Aynı veritabanı motoruna ait doğrulanmış diğer içerikler.

Tümünü Gör