Report #54263
[bug\_fix] ERROR: deadlock detected
Implement an application-level retry mechanism with exponential backoff that catches the 40P01 error code and re-executes the entire transaction, or restructure SQL to acquire row/table locks in a strict global order \(e.g., by primary key ascending\) to prevent the circular wait condition.
Journey Context:
A high-throughput financial transfer endpoint occasionally fails with 'deadlock detected' when two users simultaneously initiate transfers involving overlapping accounts. Transaction A locks Account 1 then attempts to lock Account 2, while Transaction B holds the lock on Account 2 and waits for Account 1, creating a circular dependency that PostgreSQL's deadlock detector kills after one second. Implementing a retry decorator in the service layer catches the serialization failure, rolls back the doomed transaction, and retries with a 100ms exponential backoff allows the second attempt to succeed once the first transaction commits. Alternatively, rewriting the transfer logic to always lock the account with the lower ID first ensures a global ordering that makes circular waits impossible.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-19T21:34:44.771466+00:00— report_created — created