Come determinare se ci sono [connessioni inattive con] transazioni senza commit in PostgreSQL?


24

Secondo un commento su questa domanda che ho posto in merito alle connessioni inattive in PostgreSQL 9.2 , alcune transazioni senza commit (probabilmente correlate ad alcune di quelle connessioni inattive) potrebbero causare problemi di prestazioni.

Qual è un buon modo per determinare se ci sono transazioni senza commit (punti bonus se c'è un modo per sapere se la connessione su cui si trovano è inattiva o meno)?

Grazie mille!


2
Dai un'occhiata pgtop. Puoi anche cercare le righe che mostrano "inattivo nella transazione" nell'output di ps aux.
dezso,

@dezso: pgtopsembra interessante; esiste un equivalente per Windows?
Max Vernon,

@MaxVernon ci sono alcuni suggerimenti sul fatto che dovrebbe funzionare su Windows ma non hanno visto alcun esempio concreto. Ma è ancora un progetto Perl (relativamente) semplice, quindi ... E comunque, funziona con le viste pg_stat *.
dezso,

Risposte:


16

Se vuoi vedere quante connessioni inattive hai una transazione aperta, puoi usare:

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

Ciò fornirà un elenco di connessioni aperte che sono nello stato inattivo, che hanno anche una transazione aperta.

Detto questo, non posso ricreare una connessione aperta nello stato inattivo che ha una transazione aperta. Forse qualcun altro può fornire dettagli su come farlo.


3
Attenzione che la statecolonna è presente solo in 9.2. E per me sembra che lo stato corretto sia "inattivo nella transazione".
dezso,

1
Sono d'accordo con dezso.
franchi

1
state = 'idle'non non indica una transazione aperta.
a_horse_with_no_name

2
I cannot recreate an open connection in the idle state that has an open transaction. Apri due connessioni al database e digita "inizia;" in uno. Nell'altro esegui la query sopra e avrai un idle in transaction.
X-Istence,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.