Report #9501
[bug\_fix] ERROR: deadlock detected
Ensure all application code acquires row locks in a consistent global order \(e.g., always lock table "accounts" before "transactions" by updating them in that sequence\), and implement application-level retry logic that catches SQLSTATE 40P01 and automatically retries the entire transaction.
Journey Context:
Your e-commerce app processes orders by updating the inventory table and then the order\_status table within a transaction. Under high concurrency during a flash sale, you start seeing "ERROR: deadlock detected" in the logs. You analyze \`SELECT \* FROM pg\_locks WHERE NOT granted;\` and see two transactions each holding a lock on inventory and waiting for order\_status, while the other holds order\_status and waits for inventory—a classic circular wait. You realize Transaction A updates inventory then order\_status, while Transaction B \(different code path\) updates order\_status then inventory. You refactor all code paths to update tables in alphabetical order \(inventory first, then order\_status\), eliminating the circular dependency. You also add a try/catch block in your repository layer that detects 40P01 and retries with exponential backoff, ensuring transient deadlocks \(if any edge cases remain\) don't fail user requests.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-16T08:19:25.893075+00:00— report_created — created