SQL Server Error 1205 Deadlock: Grafiği Bulma ve Önleme
SQL Server Error 1205: "Deadlock victim" — Grafiği Nerede Bulurum?
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
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):
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:
- 1Kaynak sırası: İki işlem aynı iki nesneye ters sırada mı erişiyor? (En sık neden)
- 2Kilit türü:
KEY(indeks satırı),PAGE,RANGEveyaOBJECT(tablo) mi?OBJECTgörüyorsanız kilit yükseltmesi (lock escalation) devreye girmiştir (5000+ satır kilidi tablo kilidine dönmüş). - 3Kurban: Geri alınması en ucuz işlem seçilir.
DEADLOCK_PRIORITYile 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:
ALTER TABLE dbo.Siparis SET (LOCK_ESCALATION = DISABLE);4. Kurbana karar verin. Rapor sorgularının ana akışı ezmesini engellemek için:
SET DEADLOCK_PRIORITY LOW; -- raporlama işleminde5. 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:
ALTER DATABASE uygulama_db SET READ_COMMITTED_SNAPSHOT ON;▸İlgili Mühendislik Rehberleri ve İç Linkler
- •SQL Server Login Failed (Error 18456) Analizi
- •SQL Server Bağlantı Havuzu Timeout
- •Test edilen sürümler: SQL Server 2019 / 2022
SQL Server Diğer Üretim Rehberleri
Aynı veritabanı motoruna ait doğrulanmış diğer içerikler.
SQL Server Error 18456: State Kodlarına Göre Gerçek Neden
18456 hatasında State numarası gerçek nedeni söyler. State 5, 8, 11, 18, 38 ve 40 için ayrı çözümler, ERRORLOG okuma komutları.
SQL Server Pool Timeout: Bağlantı Havuzu Tükenmesi Çözümü
"Timeout expired prior to obtaining a connection from the pool" hatasının komut zaman aşımından farkı, sızıntı tespiti ve .NET tarafında kalıcı düzeltme.
SQL Server Msg 9002: Transaction Log Full Hatası Çözümü
9002 hatasında log_reuse_wait_desc çıktısını okumak, LOG_BACKUP / ACTIVE_TRANSACTION / AVAILABILITY_REPLICA nedenlerine göre ayrı çözümler ve VLF yönetimi.