Report #13304
[bug\_fix] current transaction is aborted, commands ignored until end of transaction block \(25P02\)
Immediately issue a ROLLBACK in the exception handler to clear the aborted state before executing any new SQL, or use SAVEPOINTs to rollback to a known good point without destroying the entire transaction context.
Journey Context:
Your Python service using psycopg2 suddenly logs 'current transaction is aborted, commands ignored until end of transaction block' for all queries after a unique constraint violation. The code caught the IntegrityError, logged it to Sentry, but then continued using the same cursor to attempt a different INSERT. You realize that PostgreSQL's transaction semantics require an explicit ROLLBACK after any error; once a statement fails, the transaction enters an 'aborted' state where all subsequent commands are ignored until the transaction is closed. The connection is essentially toxic until rolled back. The immediate fix is wrapping the transaction in a try/except/finally block that guarantees conn.rollback\(\) is called in the except block before any new queries are attempted. For more complex flows, you refactor to use SAVEPOINTs: you create a savepoint before the risky operation, catch the error, and execute ROLLBACK TO SAVEPOINT, allowing the outer transaction to continue without losing prior work. This pattern is how Django's atomic\(\) and SQLAlchemy's nested transactions work internally.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-16T18:20:37.728581+00:00— report_created — created