Report #79610
[bug\_fix] ERROR: deadlock detected
Implement application-level retry logic with exponential backoff for transactions that fail with SQLSTATE 40P01. Additionally, enforce a consistent lock acquisition order \(e.g., always update users then orders, never the reverse\) across all code paths to prevent the deadlock cycle.
Journey Context:
An e-commerce platform experiences intermittent 'deadlock detected' errors during flash sales. The code path for 'create order' updates the inventory table first, then the orders table. A background reconciliation job updates the orders table first, then inventory. Under load, Transaction A locks inventory and waits for orders, while Transaction B locks orders and waits for inventory. Postgres detects the cycle and aborts one transaction \(40P01\). The developer analyzes pg\_locks and sees the conflict. They implement an immediate fix: a retry decorator in Python using Tenacity that catches psycopg2.errors.DeadlockDetected and retries with jitter. Long-term, they refactor code so all code paths lock resources in the same alphabetical order \(inventory, then orders\).
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-21T16:13:32.660767+00:00— report_created — created