Главная / Справочник ошибок / PostgreSQL
База закрыла сессию, которая долго простаивала в транзакции
FATAL: terminating connection due to idle-in-transaction timeout
Ошибка 25P03 «terminating connection due to idle-in-transaction timeout» в PostgreSQL: сессия открыла транзакцию и надолго замолчала. Почему такие сессии вредны и что делать, если ошибка пошла после настройки таймаута.
Что это значит
Сессия открыла транзакцию, ничего не делала дольше idle_in_transaction_session_timeout, и база её закрыла. Таймаут ставят специально: простаивающая транзакция держит блокировки и не даёт autovacuum чистить таблицы, база пухнет и медленнее работает.
Если ошибка появилась сразу после того, как таймаут включили, он делает свою работу: раньше такие сессии висели незаметно.
Как проверить
- Кто так себя ведёт сейчас:
select pid, usename, application_name, now() - state_change as idle, left(query, 100)
from pg_stat_activity where state = 'idle in transaction'
order by idle desc;
application_nameи последний запрос показывают сервис и место в коде.- Значение таймаута:
show idle_in_transaction_session_timeout;
Что сделать
- Оставить таймаут включённым. Для Directum RX разумно 20–30 минут.
- Передать разработчикам сервис и запрос, после которого транзакция остаётся открытой: это дефект кода, транзакцию забыли закрыть.
- Ручные сессии администраторов в psql и pgAdmin тоже попадают сюда: открытую транзакцию в консоли нужно завершать сразу.
Ошибка повторяется?
Запустите Диагностика: за полминуты он покажет состояние базы, брокера, поиска и сервера. С отчётом разберём причину за 30 минут бесплатного созвона.
Написать