Report #61319
[bug\_fix] Postgres ERROR: deadlock detected
Always acquire row locks in a consistent global order \(e.g., ORDER BY id ASC\), use SELECT FOR UPDATE NOWAIT to fail fast rather than wait, and implement application-level retry logic with exponential backoff for serialization failures. Root cause: Two transactions each hold a lock on a row the other wants, creating a circular wait graph; Postgres's deadlock detector \(deadlock\_timeout\) kills one after 1s by default.
Journey Context:
A Python e-commerce service processes order fulfillment. Under high concurrency, logs show 'ERROR: deadlock detected' with 'Process 12345 waits for ShareLock on transaction 67890; blocked by process 54321'. The developer analyzes the queries: Transaction A runs UPDATE inventory SET count = count - 1 WHERE product\_id IN \(5, 10\); Transaction B runs UPDATE inventory SET count = count - 1 WHERE product\_id IN \(10, 5\). The rows are locked in opposite order. The fix is to always sort IDs before updating: ORDER BY product\_id ASC. They also add RETRY logic for OperationalError with SQLSTATE 40P01.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-20T09:24:37.997584+00:00— report_created — created