PostgreSQL Deadlock Investigation
Combines deadlock counters and logs to identify conflicting transactions and objects, then prevents recurrence through lock ordering and index design.
Operational Safety & Risk Notice
This runbook contains operational intervention steps; several are write-impacting (KILL, terminate, DROP, RESIZE). Verify in a staging environment first, and apply sequentially in production with verification.
1. Symptom & Signals
- Uygulama SQLSTATE `40P01`, `deadlock detected` hatası alır; M9 deadlock sayacı artar.
- `pg_stat_database.deadlocks` zaman içinde artış gösterir (kümülatif sayaçtır).
2. Business & Technical Impact
PostgreSQL deadlock döngüsünü kırmak için transaction'lardan birini iptal eder; ilgili işlem retry etmezse kullanıcı işi başarısız olur. Çok sık döngü throughput'u düşürür.
3. Diagnosis & Root-Cause Analysis
SELECT datname, deadlocks, stats_reset FROM pg_stat_database
WHERE datname = current_database();İki zaman örneği arasındaki farkı alın; reset sonrası sayaç düşebilir.
4. Remediation & Action Plan
CREATE INDEX CONCURRENTLY idx_child_parent_id ON public.child (parent_id);`CONCURRENTLY` transaction bloğu içinde çalıştırılamaz ve tamamlanmadan önce yeterli disk alanı gerekir.
5. Verification & Health Checks
- Bir tam trafik döngüsü boyunca M9 artışı durur; uygulama 40P01 hata ve retry metriği normalleşir.
- Test ortamında eşzamanlı çakışma senaryosu tekrar denenir.
6. Rollback & Contingency Plan
- Yeni indeks yanlış plan oluşturduysa ilgili indeks bakım penceresinde `DROP INDEX CONCURRENTLY public.idx_child_parent_id;` ile kaldırılabilir; kilit ve plan etkisini doğrulayın.
- Log/timeout ayarlarını önceki değerlerine döndürün; iptal edilmiş transaction'lar otomatik geri gelmez.