Report #81386
[bug\_fix] ERROR: deadlock detected
Implement application-level retry logic with exponential backoff for transactions that fail with SQLSTATE 40P01, and refactor database access code to always acquire row locks in a consistent global order \(e.g., sort record IDs before updating\) to prevent the circular wait condition.
Journey Context:
An e-commerce platform experiences sporadic 500 errors during checkout. Logs reveal PostgreSQL errors: 'ERROR: deadlock detected'. Two concurrent transactions are identified: Transaction A updates inventory then user balance; Transaction B updates user balance then inventory. They form a circular dependency. The developer initially adds random retries, but deadlocks persist. Analyzing pg\_locks during the incident reveals the exact row IDs involved. The root cause is inconsistent lock ordering. The fix involves refactoring all financial update functions to always acquire locks in a strict order: sort account IDs and inventory SKUs ascending before any UPDATE, ensuring all transactions follow the same path and eliminating circular waits. Additionally, they implement proper catch-retry logic specifically for deadlock errors \(SQLSTATE 40P01\) with exponential backoff to handle rare ORM-level deadlocks.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-21T19:12:09.378906+00:00— report_created — created