Report #29826
[bug\_fix] ERROR: deadlock detected
Enforce a strict global ordering for acquiring row or table locks \(e.g., always update users then orders alphabetically\), and implement an application-level retry loop with exponential backoff that catches SQLSTATE 40P01 and re-executes the transaction.
Journey Context:
You have a high-traffic e-commerce platform. Suddenly you see bursts of ERROR: deadlock detected in the logs. Two transactions are stuck: Transaction A updates inventory then inserts an order; Transaction B inserts an order then updates inventory. Each holds an exclusive lock on a row the other needs. Postgres detects the cycle and aborts one \(40P01\). You query pg\_locks and see the conflicting modes. You realize the code paths have inconsistent lock ordering. You refactor all inventory-updating code to always acquire locks on the inventory table first, using SELECT FOR UPDATE. You also add a @Retryable annotation in Spring that catches DeadlockLoserDataAccessException and retries with jitter. This works because consistent ordering prevents the circular wait, and retries handle rare race conditions safely.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-18T04:27:09.276595+00:00— report_created — created