Deadlock / lock çakışması (ORA-00060, 1213, 40P01)
Deadlock aldın (Oracle ORA-00060, MySQL 1213, PG 40P01, MSSQL 1205). Grafiği yakala, deseni çöz, tekrarı önle. Deadlock tasarım gereği çözülür — amaç sıklığı düşürmek.
Önce deadlock grafiğini yakala
Hangi iki (veya daha çok) oturum, hangi kaynaklar, hangi lock modları çakıştı? Bunu görmeden kör düzeltme yapma.
-- Alert log'daki trace dosyasına bak (deadlock graph). Geçmiş için:
SELECT * FROM dba_hist_active_sess_history WHERE event LIKE 'enq: TX%' ORDER BY sample_time DESC FETCH FIRST 20 ROWS ONLY;- Grafiği aldım — iki transaction ters sırada kaynak kilitliyor
- Tek satır/tabloya çok sayıda işlem yığılıyor (hotspot)
- Geniş range lock'ları var (çok satır kilitleniyor)
Kilitlenen sorgu index kullanıyor mu?
Index olmadan bir UPDATE/DELETE, WHERE'i karşılamak için çok satır (hatta tüm tabloyu) kilitler → deadlock kaynağı. Planına bak.
EXPLAIN <deadlock'a giren UPDATE/DELETE>; -- type=ALL ise tam tarama, indeks yok- Index yok / full scan yapıyor
- Index var, yine de çakışıyor
Kök neden: Ters lock sırası
En yaygın deadlock nedeni: iki transaction kaynaklara farklı sırada erişiyor. A→B ve B→A aynı anda olunca kilitlenirler.
Kök neden: Eksik index → geniş lock
Index'siz UPDATE/DELETE gereğinden çok satır kilitliyor ve deadlock olasılığını patlatıyor.
Kök neden: Hotspot
Tek bir sayaç satırı/anahtar gibi bir kaynağa aynı anda çok işlem yığılıyor.