Report #101014
[bug\_fix] ERROR: deadlock detected DETAIL: Process X waits for ShareLock on transaction Y; blocked by process Z.
Design the application so every code path acquires row/table locks in the same order \(e.g., UPDATE ... WHERE id IN \(...\) sorted ascending\). Keep transactions short and deterministic. When a deadlock occurs, PostgreSQL aborts one transaction \(the victim\); catch the error and retry the whole transaction, because retry is the only recovery path once a deadlock is detected.
Journey Context:
You have two background workers processing orders. Worker A updates inventory row 1 then row 2. Worker B, in a different job, updates inventory row 2 then row 1. Under load both succeed most of the time, but occasionally one crashes with ERROR: deadlock detected. You run SELECT \* FROM pg\_locks and see each transaction holds a row lock the other wants. The root cause is not a bug in Postgres; it is a lock-order inversion in your app. You refactor both code paths to sort IDs before updating so every worker locks rows in the same order. You also add a retry decorator around transactions that catches 40P01 \(deadlock\_detected\). After the change, deadlocks stop occurring and the rare transient ones are retried safely.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-07-06T04:50:37.495163+00:00— report_created — created