Как определить, есть ли в PostgreSQL [пустые соединения с] незафиксированными транзакциями?

24

Согласно комментарию на этот вопрос, который я задавал о незанятых соединениях в PostgreSQL 9.2 , некоторые незафиксированные транзакции (возможно, связанные с некоторыми из этих незанятых соединений) могут вызывать проблемы с производительностью.

Какой хороший способ определить, есть ли незафиксированные транзакции (бонусные баллы, если есть способ узнать, является ли соединение, в котором они находятся, свободным или нет)?

Большое спасибо!

Хуан Карлос Кото
источник
2
Посмотрите на pgtop. Вы также можете охотиться за строками, показывающими «простоя в транзакции» на выходе ps aux.
Дезсо
@dezso - pgtopвыглядит интересно; есть ли эквивалент для Windows?
Макс Вернон
@MaxVernon есть некоторые намеки на то, что он должен работать в Windows, но не видел конкретного примера. Но это все еще (относительно) простой проект Perl, так что ... И в любом случае, он работает с представлениями pg_stat *.
Дезсо

Ответы:

16

Если вы хотите узнать, сколько у вас свободных соединений с открытой транзакцией, вы можете использовать:

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

Это предоставит список открытых соединений, которые находятся в состоянии ожидания, которые также имеют открытую транзакцию.

Сказав это, я не могу воссоздать открытое соединение в состоянии ожидания, в котором есть открытая транзакция. Возможно, кто-то еще может предоставить подробную информацию о том, как это сделать.

Макс Вернон
источник
3
Помните, что stateстолбец присутствует только в 9.2. И для меня это выглядит так, как будто правильное состояние «бездействует в транзакции».
Дезсо
1
Я согласен с Дезсо.
франки
1
state = 'idle'это не указывает на открытую транзакцию.
a_horse_with_no_name
2
I cannot recreate an open connection in the idle state that has an open transaction. Откройте два соединения с базой данных и введите «начало»; в одном. В другом случае запустите приведенный выше запрос, и вы получите idle in transaction.
X-Istence