Deadlock Nedir? PostgreSQL'te Kilitlenme Sorunlarını Çözmek
# Deadlock Nedir? PostgreSQL'te Kilitlenme Sorunlarını Çözmek
Deadlock, iki veya daha fazla işlemin birbirinin tuttuğu kaynağı beklediği durumdur. PostgreSQL'te bu genellikle tablo satırlarının kilitlenmesiyle ortaya çıkar. A işlemi X satırını kilitler ve Y satırını beklerken, B işlemi Y satırını kilitler ve X satırını beklerse, sonsuz döngü başlar.
Deadlock tipik olarak şu senaryoda gerçekleşir:
1. İşlem 1: Satır A'yı UPDATE eder (kilitler)
2. İşlem 2: Satır B'yi UPDATE eder (kilitler)
3. İşlem 1: Satır B'yi UPDATE etmeye çalışır BEKLER (İşlem 2 kilitli)
4. İşlem 2: Satır A'yı UPDATE etmeye çalışır BEKLER (İşlem 1 kilitli)
PostgreSQL bunu otomatik olarak algılar ve bir işlemi iptal eder. Hata alırsınız: deadlock detected.
İki terminal açıp aynı anda çalıştırın.
Terminal 1:
1BEGIN;2UPDATE users SET balance = balance - 100 WHERE id = 1;3-- Burada ENTER'a basıp bekleyin4UPDATE users SET balance = balance + 100 WHERE id = 2;5COMMIT;Terminal 2 (hızlıca):
1BEGIN;2UPDATE users SET balance = balance - 100 WHERE id = 2;3UPDATE users SET balance = balance + 100 WHERE id = 1;4COMMIT;Beklenen çıktı: Terminal 2'de `ERROR: deadlock detected` hatası alırsınız.
1. İşlem sırasını tutarlı tutun
Her zaman aynı sırada satırları güncelleyin:
1BEGIN;2UPDATE users SET balance = balance - 100 WHERE id = 1;3UPDATE users SET balance = balance + 100 WHERE id = 2;4COMMIT;2. Kilit zaman aşımını ayarlayın
1SET lock_timeout = '5s';5 saniye sonra kilitli işlem otomatik iptal olur.
3. Daha kısa işlemler yazın
Deadlock riski, işlem süresi uzadıkça artar. Gereksiz SELECT'leri işlem dışına taşıyın.
4. Sorguları kontrol edin
Deadlock günlüğünü kontrol et:
1SET log_min_duration_statement = 0;2SET log_lock_waits = on;PostgreSQL günlüğünde deadlock detaylarını göreceksiniz.
Deadlock kaçınılmaz değildir; doğru tasarımla çoğunluğu önleyebilirsiniz. İşlem sırasını sabitleyin, işlemleri kısa tutun ve hata yönetimi ekleyin. Deadlock alırsanız, işlemi yeniden deneyin (retry logic).
0 yorum