Перейти к содержимому
15 / 15

Чем опасна одна долгая транзакция и что она ломает кроме себя?

Долгая транзакция удерживает горизонт видимости: пока она открыта, вакуум не имеет права убирать версии строк, которые могли бы ей понадобиться. Поэтому один забытый BEGIN в консоли или зависшая транзакция в пуле приводят к раздуванию всех активных таблиц базы, а не только тех, к которым транзакция обращалась. Второе следствие — блокировки: взятые ею блокировки держатся до конца, и за ними выстраивается очередь. Третье — репликация: на реплике долгий запрос либо задерживает применение WAL, либо получает отмену по конфликту. Особый случай — состояние idle in transaction: приложение открыло транзакцию, сходило во внешний сервис и ждёт ответа; для базы это полноценная открытая транзакция. Лечится настройкой idle_in_transaction_session_timeout, коротким statement_timeout, вынесением внешних вызовов за границы транзакции и мониторингом самой старой транзакции в кластере.

Чем опасна одна долгая транзакция и что она ломает кроме себя? | JScriptiser