DBAtlas · Veritabanı operasyon atlası

Deadlock analizi

Belirti

'deadlock detected', 'ORA-00060', 'chosen as deadlock victim' — transaction'lar birbirini kilitleyip biri iptal ediliyor.

1. Deadlock normaldir ama sık olmamalı

DB deadlock'u tespit edip birini kurban seçerek çözer — bu tasarım gereğidir. Amaç sıklığı azaltmak. Uygulama kurban seçilen transaction'ı yeniden denemeli (retry). Önce deadlock grafiğini yakala.

2. Deadlock grafiğini/detayını al

Hangi iki (veya daha çok) oturum, hangi kaynaklar, hangi lock modları çakıştı?

Oracle

-- Alert log'daki trace dosyasına bak (deadlock graph). Ayrıca:
SELECT * FROM dba_hist_active_sess_history WHERE event LIKE 'enq: TX%' ORDER BY sample_time DESC;

PostgreSQL

-- log_lock_waits=on ve deadlock detayı postgresql.log içinde. deadlock_timeout ayarını kontrol et.

MySQL

SHOW ENGINE INNODB STATUS\G  -- LATEST DETECTED DEADLOCK bölümü

SQL Server

-- system_health Extended Event oturumunda deadlock XML'i (ring_buffer, son olaylar):
SELECT x.ev.value('@timestamp','datetime2') AS zaman, x.ev.query('.') AS deadlock_xml
FROM (SELECT CAST(t.target_data AS XML) td FROM sys.dm_xe_session_targets t
      JOIN sys.dm_xe_sessions s ON s.address = t.event_session_address
      WHERE s.name = N'system_health' AND t.target_name = N'ring_buffer') r
CROSS APPLY r.td.nodes('//RingBufferTarget/event[@name="xml_deadlock_report"]') AS x(ev);
-- Daha uzun geçmiş için event_file hedefi:
-- SELECT CAST(event_data AS XML) FROM sys.fn_xe_file_target_read_file(N'system_health*.xel', NULL, NULL, NULL) WHERE object_name = N'xml_deadlock_report';

3. Çakışma desenini çöz

En yaygın neden: iki transaction'ın kaynaklara TERS sırada erişmesi. Tüm kod yollarında kaynaklara AYNI sırada eriş. İkinci yaygın neden: eksik index yüzünden geniş range lock'ları — gereken index'i ekle.

4. Lock süresini ve kapsamını azalt

Transaction'ları kısa tut (kullanıcı etkileşimini transaction içine alma). Uygun izolasyon seviyesi seç. Gerektiğinde row lock'u erken al (SELECT ... FOR UPDATE ile deterministik sıralama).

5. Uygulamada retry şart

Deadlock tamamen elimine edilemez; kurban seçilen transaction için otomatik yeniden deneme (exponential backoff) uygula. Bu, kullanıcının hata görmesini engeller.

DBAtlas'ta aç →