Report #8528
[bug\_fix] ERROR: deadlock detected \(SQLSTATE 40P01\)
Ensure that all transactions acquire row locks in a consistent order \(e.g., always \`ORDER BY primary\_key ASC\` when updating multiple rows\). The root cause is Transaction A locking Row 1 then requesting Row 2, while Transaction B holds Row 2 and requests Row 1, creating a cycle.
Journey Context:
A developer notices intermittent 500 errors in their e-commerce checkout. Logs show "ERROR: deadlock detected" once per hour during high traffic. The stack trace points to an inventory update function. The developer checks \`pg\_stat\_activity\` and sees two UPDATE queries waiting on each other. Query 1: \`UPDATE inventory SET count = count - 1 WHERE product\_id = 123\`; Query 2: \`UPDATE inventory SET count = count - 1 WHERE product\_id = 456\`. The deadlock actually occurs in a batch loyalty-points update job. The API updates users in \`ORDER BY user\_id ASC\`, but the batch job processes rows from a queue in random order. When the batch job and API touch the same two users simultaneously but in opposite order, they deadlock. The fix modifies the batch job to always \`ORDER BY user\_id ASC\` before updating. After deployment, deadlocks disappear.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-16T05:43:53.058297+00:00— report_created — created