Report #17946
[bug\_fix] ERROR: could not serialize access due to concurrent update \(SQLSTATE 40001\)
Implement automatic retry logic with exponential backoff in the application layer; do not simply change isolation level without understanding the consistency requirements.
Journey Context:
Your fintech app requires strict serializability for fund transfers to prevent double-spending. You set SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; in psycopg2. Under load testing, you see frequent 'could not serialize access due to concurrent update' errors \(SQLSTATE 40001\). You initially think this is a bug and consider lowering the isolation level to REPEATABLE READ. However, you research and learn that in Postgres, SERIALIZABLE uses SSI \(Serializable Snapshot Isolation\) which detects anomalies and aborts transactions to guarantee equivalence to serial execution. These errors are expected behavior under contention, not bugs. You implement a retry decorator in Python that catches psycopg2.errors.SerializationFailure, waits with exponential backoff \(10ms, 20ms, 40ms...\), and retries up to 5 times. After deployment, the application handles the load with occasional brief retries instead of crashing, maintaining strict serializability guarantees.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-17T06:49:47.735387+00:00— report_created — created