Jak ustalić, czy w PostgreSQL istnieją [bezczynne połączenia z] niezatwierdzonymi transakcjami?

24

Zgodnie z komentarzem do tego pytania, które zadałem na temat bezczynnych połączeń w PostgreSQL 9.2 , niektóre niezaangażowane transakcje (prawdopodobnie związane z niektórymi z tych bezczynnych połączeń) mogą powodować pewne problemy z wydajnością.

Jaki jest dobry sposób na ustalenie, czy są niezatwierdzone transakcje (punkty bonusowe, jeśli istnieje sposób, aby sprawdzić, czy połączenie, na którym się znajdują, jest bezczynne)?

Dziękuję bardzo!

Juan Carlos Coto
źródło
2
Spójrz na pgtop. Możesz także wyszukać wiersze z informacją o „bezczynności w transakcji” na wyjściu ps aux.
dezso
@dezso - pgtopwygląda interesująco; czy istnieje odpowiednik dla systemu Windows?
Max Vernon
@ MaxVernon jest kilka wskazówek, że ma działać w systemie Windows, ale nie widział żadnego konkretnego przykładu. Ale wciąż jest to (stosunkowo) prosty projekt Perla, więc ... W każdym razie działa na widokach pg_stat *.
dezso

Odpowiedzi:

16

Jeśli chcesz zobaczyć, ile masz wolnych połączeń, które mają otwartą transakcję, możesz użyć:

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

Spowoduje to wyświetlenie listy otwartych połączeń będących w stanie bezczynności, które również mają otwartą transakcję.

Powiedziawszy to, nie mogę odtworzyć otwartego połączenia w stanie bezczynności z otwartą transakcją. Być może ktoś inny może podać szczegółowe informacje, jak to zrobić.

Max Vernon
źródło
3
Uwaga: statekolumna jest obecna tylko w wersji 9.2. I dla mnie wygląda na to, że właściwym stanem jest „bezczynność w transakcji”.
dezso
1
Zgadzam się z dezso.
franków
1
state = 'idle'ma nie oznaczać otwartą transakcję.
a_horse_w_no_name
2
I cannot recreate an open connection in the idle state that has an open transaction. Otwórz dwa połączenia z bazą danych i wpisz „begin;” w jednym. W drugim uruchom powyższe zapytanie, a będziesz mieć idle in transaction.
X-Istence