Comment déterminer s'il existe des [connexions inactives avec] des transactions non validées dans PostgreSQL?

24

Selon un commentaire sur cette question que j'ai posée sur les connexions inactives dans PostgreSQL 9.2 , certaines transactions non validées (éventuellement liées à certaines de ces connexions inactives) peuvent entraîner des problèmes de performances.

Quelle est la bonne façon de déterminer s'il y a des transactions non engagées (des points bonus s'il y a un moyen de savoir si la connexion sur laquelle ils sont connectés est inactive ou non)?

Merci beaucoup!

Juan Carlos Coto
la source
2
Jetez un oeil à pgtop. Vous pouvez également rechercher des lignes indiquant "inactif dans la transaction" dans la sortie de ps aux.
dezso
@dezso - pgtopsemble intéressant; existe-t-il un équivalent pour Windows?
Max Vernon
@MaxVernon il y a quelques indices qu'il est censé fonctionner sur Windows mais n'a vu aucun exemple concret. Mais c'est toujours un projet Perl (relativement) simple, donc ... Et de toute façon, cela fonctionne sur les vues pg_stat *.
dezso

Réponses:

16

Si vous voulez voir combien de connexions inactives vous avez qui ont une transaction ouverte, vous pouvez utiliser:

select * 
from pg_stat_activity
where (state = 'idle in transaction')
    and xact_start is not null;

Cela fournira une liste des connexions ouvertes qui sont à l'état inactif, qui ont également une transaction ouverte.

Cela dit, je ne peux pas recréer une connexion ouverte à l'état inactif qui a une transaction ouverte. Peut-être que quelqu'un d'autre peut fournir des détails sur la façon de procéder.

Max Vernon
la source
3
Attention, la statecolonne n'est présente qu'en 9.2. Et pour moi, il semble que l'état approprié soit «inactif dans les transactions».
dezso
1
Je suis d'accord avec dezso.
francs
1
state = 'idle'n'indique pas une transaction ouverte.
a_horse_with_no_name
2
I cannot recreate an open connection in the idle state that has an open transaction. Ouvrez deux connexions à la base de données et tapez "commencer;" dans une. Dans l'autre, exécutez la requête ci-dessus et vous obtiendrez un idle in transaction.
X-Istence