Deadlock nedir? Veritabanında nasıl oluşur ve nasıl önlenir?

Cevap

Deadlock, iki (veya daha fazla) transaction'ın birbirinin tuttuğu kilidi beklemesi ve hiçbirinin ilerleyememesidir.

Örnek

-- Transaction A                      -- Transaction B
BEGIN;                                 BEGIN;
UPDATE hesaplar SET ... WHERE id = 1;  UPDATE hesaplar SET ... WHERE id = 2;
-- id=1 kilitli                         -- id=2 kilitli
UPDATE hesaplar SET ... WHERE id = 2;  UPDATE hesaplar SET ... WHERE id = 1;
-- B'yi bekler                          -- A'yı bekler -> DEADLOCK

Para transferinde A, 1'den 2'ye; B ise 2'den 1'e aynı anda gönderim yaparsa tam olarak bu olur.

Veritabanı ne yapar?

PostgreSQL ve MySQL bekleme grafiğinde döngü tespit eder ve transaction'lardan birini kurban seçip iptal eder (PostgreSQL: deadlock detected, MySQL: error 1213). Diğeri devam eder. Uygulama iptal edilen transaction'ı yeniden denemelidir.

Önleme yöntemleri

  1. Kilitleri her zaman aynı sırada alın. Transfer örneğinde önce küçük ID'li hesabı kilitleyin:
SELECT * FROM hesaplar WHERE id IN (1, 2) ORDER BY id FOR UPDATE;
  1. Transaction'ları kısa tutun; transaction içinde HTTP çağrısı veya kullanıcı beklemesi yapmayın.
  2. Doğru index kullanın; index olmadan UPDATE ... WHERE gereğinden fazla satırı (veya gap'i) kilitleyebilir.
  3. Gerekenden yüksek isolation level kullanmayın.
  4. lock_timeout ile sonsuza kadar beklemeyi engelleyin; NOWAIT veya SKIP LOCKED ile alternatif akış kurun (iş kuyruğu tablolarında SKIP LOCKED çok kullanılır).

Tespit

PostgreSQL'de log_lock_waits = on ve log'lardaki deadlock detayları; MySQL'de SHOW ENGINE INNODB STATUS son deadlock'u gösterir.

  1. INNER JOIN ile LEFT JOIN arasındaki fark nedir?KolayVeritabanı & SQLBackend
  2. Bir tablodaki ikinci en yüksek maaşı bulun.OrtaVeritabanı & SQLBackend
  3. Index nedir? Dezavantajları nelerdir?OrtaVeritabanı & SQLBackend
  4. ACID nedir?OrtaVeritabanı & SQLBackend
  5. Normalizasyon nedir? Ne zaman denormalizasyon yaparsınız?ZorVeritabanı & SQLBackend
  6. N+1 sorgu problemi nedir ve nasıl çözülür?OrtaVeritabanı & SQLBackend

Bu konuda başka bir soru biliyor musun?

Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.

Soru ekle