PostgreSQL: idle-in-transaction timeout
FATAL: terminating connection due to idle-in-transaction timeoutYour session opened a transaction and then sat idle longer than idle_in_transaction_session_timeout, so Postgres closed it. Commit or roll back promptly, and do not hold a transaction open across slow work.
What this error means
An open transaction that sits idle holds locks and blocks vacuum. To prevent that, Postgres can close sessions that stay idle inside a transaction beyond a configured timeout, which raises this error on the client.
It usually means the app ran BEGIN, then did something slow such as a network call or waiting on user input, without committing.
How to fix it
A transaction is held open too long
Commit or roll back as soon as the work is done. Do not keep a transaction open across I/O or user think-time.
The timeout is too aggressive for a legitimate job
Raise it for that session only.
SET idle_in_transaction_session_timeout = '60s';An ORM leaves transactions open
Make sure the ORM commits or rolls back and returns connections to the pool promptly.
How to avoid it next time
- Keep transactions short and do slow work outside them.
- Add reconnect logic so a closed session recovers cleanly.
Frequently asked questions
Why does Postgres kill idle transactions?
An idle-in-transaction session holds locks and prevents vacuum from cleaning up, which harms the whole server. The timeout bounds that damage.
What sets this off with an ORM?
A transaction opened and left open across a slow operation. Make sure the ORM commits or rolls back promptly.
Stop struggling with SQL
Use FluentDB, the AI database client for macOS.
Related errors
Part of the PostgreSQL error reference. Last reviewed 2026-07-31.