Aller au contenu principal
Kill -9 Club
Se connecter

idle in transaction (transaction restée ouverte)

Bases de données

L'état qu'affiche pg_stat_activity pour une session qui a lancé un BEGIN, garde la transaction ouverte et n'exécute plus rien. Elle ne consomme pas de CPU et n'apparaît dans aucun graphique de charge : c'est pourquoi on la croit inoffensive. C'est l'état le plus coûteux du serveur. Elle garde les verrous acquis, et autovacuum ne peut pas supprimer une ligne morte encore visible par une transaction plus ancienne qu'elle : une session oubliée un après-midi suffit à faire gonfler une base entière pendant que la charge reste nulle. L'origine est presque toujours applicative — un BEGIN, un appel réseau vers un service tiers, et un COMMIT qui n'arrive pas parce que l'appel a expiré. Triez pg_stat_activity par now() - query_start décroissant : la ligne la plus ancienne est la cause, les suivantes sont ses victimes. Essayez pg_cancel_backend avant pg_terminate_backend, qui coupe la connexion.

Aussi écrit : transaction restée ouverte, idle_in_transaction