La base de données a une connexion de longue durée à l'état Transaction inactive - Amazon Relational Database Service

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

La base de données a une connexion de longue durée à l'état Transaction inactive

Une connexion à la base de données est à l'état idle in transaction depuis plus de 1 800 secondes.

Versions de moteur prises en charge

Ces données d'insight sont prises en charge pour toutes les versions de RDS pour PostgreSQL.

Contexte

Une transaction à l'état idle in transaction peut contenir des verrous qui bloquent d'autres requêtes. Elle peut également empêcher VACUUM (y compris autovacuum) de nettoyer les lignes inactives, ce qui entraînerait le gonflement des index ou des tables ou le renvoi à la ligne des identifiants de transactions.

Causes probables de ce problème

Une transaction initiée dans une session interactive avec BEGIN ou START TRANSACTION ne s'est pas terminée à l'aide d'une commande COMMIT, ROLLBACK ou END. Cela entraîne le passage de la transaction à l'état idle in transaction.

Actions

Vous pouvez trouver les transactions inactives en exécutant la requête pg_stat_activity.

Dans votre client SQL, exécutez la requête suivante pour répertorier toutes les connexions à l'état idle in transaction et les ordonner par durée :

SELECT now() - state_change as idle_in_transaction_duration, now() - xact_start as xact_duration,* FROM pg_stat_activity WHERE state = 'idle in transaction' AND xact_start is not null ORDER BY 1 DESC;

Nous vous recommandons différentes actions en fonction des causes de votre insight.

Arrêt de la transaction

Lorsque vous lancez une transaction dans une session interactive avec BEGIN ou START TRANSACTION, elle passe à l'état idle in transaction. Elle reste dans cet état jusqu'à ce que vous terminiez la transaction en émettant une commande COMMIT, ROLLBACK ou END, ou que vous déconnectiez complètement la connexion pour annuler la transaction.

Interruption de la connexion

Mettez fin à la connexion avec une transaction inactive à l'aide de la requête suivante :

SELECT pg_terminate_backend(pid);

pid est l'ID de processus de la connexion.

Configuration du paramètre idle_in_transaction_session_timeout

Définissez le paramètre idle_in_transaction_session_timeout dans le nouveau groupe de paramètres. La configuration de ce paramètre présente l'avantage de ne pas nécessiter d'intervention manuelle pour mettre fin à la longue période d'inactivité de la transaction. Pour plus d'informations sur ce paramètre, consultez la documentation PostgreSQL.

Le message suivant sera enregistré dans le fichier journal de PostgreSQL après l'interruption de la connexion, quand une transaction sera dans l'état idle_in_transaction pendant un temps supérieur à la durée spécifiée.

FATAL: terminating connection due to idle in transaction timeout

Vérification du statut AUTOCOMMIT

AUTOCOMMIT est activé par défaut. Mais s'il est désactivé accidentellement dans le client, veillez à le réactiver.

  • Dans votre client psql, exécutez la commande suivante :

    postgres=> \set AUTOCOMMIT on
  • Dans pgadmin, activez-la en choisissant l'option AUTOCOMMIT à partir de la flèche déroulante.

    
                            Dans pgadmin, choisissez AUTOCOMMIT pour l'activer.

Vérification de la logique de transaction dans le code de votre application

Examinez la logique de votre application pour détecter d'éventuels problèmes. Procédez comme suit :

  • Vérifiez si la validation automatique JDBC est définie sur true dans votre application. Pensez également à utiliser des commandes COMMIT explicites dans votre code.

  • Vérifiez votre logique de gestion des erreurs pour voir si elle clôture une transaction après des erreurs.

  • Vérifiez si votre application met du temps à traiter les lignes renvoyées par une requête lorsque la transaction est ouverte. Si tel est le cas, pensez à coder l'application pour clôturer la transaction avant de traiter les lignes.

  • Vérifiez si une transaction contient de nombreuses opérations de longue durée. Si tel est le cas, divisez une transaction individuelle en plusieurs transactions.

Métriques pertinentes

Les métriques PI suivantes sont liées à cet insight :

  • idle_in_transaction_count : nombre de sessions à l'état idle in transaction.

  • idle_in_transaction_max_time : durée de la transaction la plus longue à l'état idle in transaction.