40P01: deadlock_detected
PostgreSQLWas bedeutet das?
Zwei oder mehr Transaktionen sind in einen Deadlock geraten, weil jede auf Sperren wartet, die die andere hält. PostgreSQL erkennt den Zyklus und bricht eine der Transaktionen ab.
Ursache
Sperren in unterschiedlicher Reihenfolge, Updates derselben Zeilen über Kreuz, lange Transaktionen oder kollidierende Sperren bei Foreign-Key-Prüfungen.
Lösung
Das Deadlock-Detail im Serverlog zeigt die beteiligten Abfragen. Greife in allen Transaktionen in derselben Reihenfolge auf Tabellen/Zeilen zu. Halte Transaktionen kurz. Fange die abgebrochene Transaktion in der Anwendung ab und wiederhole sie. Verknüpfe pg_locks mit pg_stat_activity, um Sperren zu untersuchen. Lege die Sperrreihenfolge bei Bedarf mit SELECT ... FOR UPDATE explizit fest.