40P01: deadlock_detected
PostgreSQLNe demek?
İki veya daha fazla transaction, birbirinin tuttuğu lock'ları karşılıklı bekleyerek deadlock'a girdi. PostgreSQL döngüyü tespit edip transaction'lardan birini iptal eder.
Neden olur?
Lock'ların farklı sıralarda alınması, aynı satırların çapraz güncellenmesi, uzun transaction'lar veya foreign key kontrolleri sırasında oluşan çakışan lock'lar.
Nasıl çözülür?
Sunucu loglarındaki deadlock detayı çakışan sorguları gösterir. Tüm transaction'larda tablo/satırlara aynı sırada erişin. İşlemleri kısa tutun. İptal edilen transaction'ı uygulamada yakalayıp yeniden deneyin (retry). Lock'ları incelemek için pg_locks ile pg_stat_activity'yi birleştirin. Gerekirse SELECT ... FOR UPDATE ile lock sırasını belirginleştirin.