DBAtlas · Veritabanı operasyon atlası

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.

DBAtlas'ta aç →