Report #17275
[bug\_fix] FATAL: terminating connection due to idle-in-transaction timeout
Set the PostgreSQL configuration parameter \`idle\_in\_transaction\_session\_timeout\` to a non-zero value \(e.g., 10 minutes or 600000 milliseconds\) to automatically terminate connections that remain idle in a transaction block for too long. Additionally, refactor application code to ensure transactions are committed or rolled back promptly, especially before calling external services.
Journey Context:
A Python Flask application using SQLAlchemy with Celery for background tasks experiences a gradual increase in database connections until the pool is exhausted and new requests fail with 'FATAL: sorry, too many clients already'. Investigation reveals numerous connections in the \`idle in transaction\` state for over an hour, holding back autovacuum and consuming connection slots. The culprit is a Celery task decorated with \`@transaction.atomic\` that calls an external payment gateway API. When the external API hangs indefinitely due to a network partition, the Python process remains stuck inside the transaction block, keeping the database connection open and idle. The developer initially looks for a connection leak in the pool but realizes the transactions are legitimately open from the application's perspective. The fix involves two steps: first, configuring PostgreSQL with \`idle\_in\_transaction\_session\_timeout = 10min\` in postgresql.conf to automatically kill any backend that sits idle in a transaction longer than 10 minutes; second, refactoring the Celery task to move the external API call outside of the atomic block, or using a shorter HTTP timeout and ensuring the transaction is committed before the external call. After deployment, the zombie connections are automatically cleaned up by Postgres, and the connection pool remains stable.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-17T04:53:45.395560+00:00— report_created — created