Como determinar se há [conexões inativas com] transações não confirmadas no PostgreSQL?

24

De acordo com um comentário sobre essa pergunta, perguntei sobre conexões inativas no PostgreSQL 9.2 , algumas transações não confirmadas (possivelmente relacionadas a algumas dessas conexões inativas) podem causar alguns problemas de desempenho.

Qual é uma boa maneira de determinar se há transações não confirmadas (pontos de bônus se houver uma maneira de saber se a conexão em que estão conectados está ociosa ou não)?

Muito obrigado!

Juan Carlos Coto
fonte
2
Dê uma olhada pgtop. Você também pode procurar por linhas mostrando "inativo na transação" na saída de ps aux.
Dezso13
@dezso - pgtopparece interessante; existe um equivalente para o Windows?
Max Vernon
@ MaxVernon, existem algumas dicas de que ele deve funcionar no Windows, mas ainda não vi nenhum exemplo concreto. Mas ainda é um projeto Perl (relativamente) simples, então ... E de qualquer maneira, ele funciona nas visualizações pg_stat *.
Dezso

Respostas:

16

Se você quiser ver quantas conexões inativas você possui e que possui uma transação aberta, você pode usar:

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

Isso fornecerá uma lista de conexões abertas que estão no estado ocioso, que também possuem uma transação aberta.

Dito isto, não posso recriar uma conexão aberta no estado ocioso que possui uma transação aberta. Talvez alguém possa fornecer detalhes sobre como fazer isso.

Max Vernon
fonte
3
Cuidado que a statecoluna está presente apenas no 9.2. E para mim, parece que o estado adequado é "inativo na transação".
Dezso13
1
Eu concordo com dezso.
francos
1
state = 'idle'que não indicam uma transação aberta.
precisa saber é o seguinte
2
I cannot recreate an open connection in the idle state that has an open transaction. Abra duas conexões com o banco de dados e digite "begin;" em um. Na outra, execute a consulta acima e você terá um idle in transaction.
X-Istence