Як визначити, чи є [непрацюючі з'єднання з] незапущеними транзакціями в PostgreSQL?


24

Відповідно до коментаря до цього запитання, який я запитував про непрацюючі з'єднання в PostgreSQL 9.2 , деякі непередавані транзакції (можливо, пов'язані з деякими з цих непрацюючих з'єднань) можуть спричинити деякі проблеми з продуктивністю.

Який хороший спосіб визначити, чи немає транзакцій (бонусні бали, якщо є спосіб дізнатися, чи працює з'єднання в режимі очікування чи немає)?

Дуже дякую!


2
Погляньте pgtop. Ви також можете полювати на рядки, що відображають у режимі простою транзакцію " ps aux.
dezso

@dezso - pgtopвиглядає цікаво; є еквівалент для Windows?
Макс Вернон

@MaxVernon є деякі натяки на те, що він повинен працювати в Windows, але не бачив конкретного прикладу. Але це все-таки (відносно) простий проект Perl, тому ... І все одно, він працює на переглядах pg_stat *.
dezso

Відповіді:


16

Якщо ви хочете побачити, скільки у вас непрацюючих з'єднань, які мають відкриту транзакцію, ви можете використовувати:

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

Це забезпечить перелік відкритих з'єднань, які знаходяться в режимі очікування, які також мають відкриту транзакцію.

Сказавши це, я не можу відтворити відкрите з'єднання в режимі очікування, у якому є відкрита транзакція. Можливо, хтось ще може надати детальну інформацію про те, як це зробити.


3
Слідкуйте, що stateстовпець присутній лише у 9.2. І для мене схоже, що належний стан "простоює в транзакціях".
dezso

1
Я згоден з dezso.
франки

1
state = 'idle'це НЕ вказує на відкриту транзакцію.
a_horse_with_no_name

2
I cannot recreate an open connection in the idle state that has an open transaction. Відкрийте два підключення до бази даних та введіть "start;" в одному. В іншому запустіть вищезазначений запит, і у вас з'явиться idle in transaction.
X-Istence
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.