Как определить, есть ли в 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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.