dataiotech Labs
dbaguidedbaguideDBAdataxtoolsdataopsphere
Home/Hata Teşhis Kütüphanesi/postgresql-deadlock-detected
PostgreSQL
PostgreSQL 14–18Kilitler & Eşzamanlılık
8 dk okuma
ERROR: deadlock detected

PostgreSQL "deadlock detected" — Hangi İki İşlem Birbirini Kilitledi?

PostgreSQL deadlock hatasında bloklayan oturumları pg_blocking_pids ile bulma, log_lock_waits ayarı ve erişim sırası düzeltmesi.

İnceleyen:Principal SRE & Lead Database Architect
Test Edilen Sürümler: PostgreSQL 18.6 & 17.11 (Alpine Linux / Docker 29.7) | Tarihsel: PostgreSQL 14, 15, 16

Operasyonel Doğrulama & Güvenilirlik Standardı

Son Teknik İnceleme: 29 Ekim 2026
Test Edilen SürümlerPostgreSQL 18.6 & 17.11 | Tarihsel: PostgreSQL 14.10, 15.6, 16.4
Gerekli Yetkipg_stat_activity ve pg_blocking_pids() sorgulama yetkisi
Risk Seviyesi
HighDeadlock tespit edildiğinde PostgreSQL kurban işlemi (victim transaction) anında abort eder
Beklenen ÇıktıDeterministik ORDER BY kilit sıralaması ve log_lock_waits ile kilit döngülerinin engellenmesi
Geri Dönüş (Rollback) Planı:Uygulama katmanında sınırlı ve jitter destekli otomatik retry mekanizması işletme
PostgreSQL Docs: Explicit Locking & Deadlocks
İlk 60 Saniye Teşhis Protokolü:

Hata mesajı semptomdur, kök neden değildir. Sunucuyu yeniden başlatmadan veya rastgele ayar değiştirmeden önce aşağıdaki "Nedeni ayırt eden tek sorgu"yu çalıştırarak gerçek senaryoyu netleştirin.

▸Belirti

plaintext
ERROR: deadlock detected DETAIL: Process 4821 waits for ShareLock on transaction 9102; blocked by process 9102. Process 9102 waits for ShareLock on transaction 4821; blocked by process 4821. HINT: See server log for query details.

PostgreSQL döngüsel kilitlenmeyi (Wait-For Graph) tespit ettiğinde işlemlerden birini kurban seçerek anında iptal eder (SQLSTATE 40P01). Bu kontrol deadlock_timeout (varsayılan 1 saniye) süresi dolmadan tetiklenmez; yani 1 saniyeden kısa süren kilit beklemeleri deadlock kontrolüne takılmaz.


▸Blokaj Zincirini ve Kök Oturumu Bulma

PostgreSQL'in bu iş için yerleşik fonksiyonu vardır:

sql
SELECT pid, pg_blocking_pids(pid) AS bloklayanlar, state, now() - query_start AS suredir, left(query, 100) AS sorgu FROM pg_stat_activity WHERE cardinality(pg_blocking_pids(pid)) > 0 ORDER BY suredir DESC;

bloklayanlar dizisinde yer alan ve kendi bloklayanlar hücresi boş olan oturum kilit ağacının tepesindeki kök nedendir.

Kilit beklemelerini kalıcı kayıt altına almak için:

sql
ALTER SYSTEM SET log_lock_waits = on; SELECT pg_reload_conf();

Artık deadlock_timeout süresini aşan her kilit beklemesi deadlock oluşmasa dahi sunucu günlüğüne kaydedilir.


▸En Sık Üç Kök Neden

1. Ters Tablo Erişim Sırası

  • •İşlem A: hesap tablosunu kilitler → hareket tablosunu bekler.
  • •İşlem B: hareket tablosunu kilitler → hesap tablosunu bekler.

Çözüm: Tüm uygulama kodlarında tabloların her zaman alfabetik veya hiyerarşik aynı sırayla kilitlenmesini sağlayın.

2. Yabancı Anahtar (Foreign Key) Kontrolleri

PostgreSQL'de FK kontrolleri ebeveyn satır üzerinde FOR KEY SHARE kilidi alır. İki eşzamanlı işlem farklı tablolara yazarken birbirlerinin ebeveyn satırlarını güncelliyorsa kilitlenme veritabanı motoru katmanında tetiklenir.

3. Toplu Güncellemelerde Rastgele Satır Sıralaması

sql
-- YANLIŞ: IN listesi deterministik sırada kilitlenmez UPDATE hesap SET bakiye = bakiye - 10 WHERE id IN (42, 17, 99); -- DOĞRU: Sıralı ve deterministik kilit edinimi UPDATE hesap SET bakiye = bakiye - 10 WHERE id IN (SELECT unnest(ARRAY[42, 17, 99]) ORDER BY 1);

▸Uygulama Tarafında Yeniden Deneme (Retry) Politikası

Deadlock kurbanı işlem tamamen geri alınır; uygulama katmanında bu durum standart bir akış olarak ele alınmalıdır:

  • •Yalnızca 40P01 (deadlock) ve 55P03 (lock not available) kodları yeniden denenmelidir.
  • •İşlem mutlaka idempotent olmalıdır.
  • •Üstel geri çekilme (exponential backoff) ve rastgele gecikme (jitter) kullanılmalıdır.
UYARI
deadlock_timeout değerini yükseltmeyin; yükseltmek tespiti geciktirir ve tüm oturumların kuyrukta beklemesine yol açar.

Diğer Veritabanı Hata Teşhisleri

Kriz anında başvurabileceğiniz diğer doğrulanmış hata rehberleri.

Tüm Hatalar (50)