Bagaimana cara menentukan apakah ada [koneksi idle dengan] transaksi tidak terikat di PostgreSQL?

24

Menurut komentar pada pertanyaan ini saya bertanya tentang koneksi idle di PostgreSQL 9.2 , beberapa transaksi yang tidak dikomit (mungkin terkait dengan beberapa koneksi idle) mungkin menyebabkan beberapa masalah kinerja.

Apa cara yang baik untuk menentukan apakah ada transaksi yang tidak dikomit (poin bonus jika ada cara untuk mengetahui apakah koneksi mereka sedang menganggur atau tidak)?

Terima kasih banyak!

Juan Carlos Coto
sumber
2
Lihatlah pgtop. Anda juga dapat mencari baris yang menunjukkan "idle in transaction" di output dari ps aux.
dezso
@dezso - pgtopterlihat menarik; apakah ada yang setara untuk Windows?
Max Vernon
@ MaxVernon ada beberapa petunjuk bahwa itu seharusnya bekerja pada Windows tetapi belum melihat contoh nyata. Tapi ini masih merupakan proyek Perl yang relatif sederhana, jadi ... Lagi pula, ini bekerja pada tampilan pg_stat *.
dezso

Jawaban:

16

Jika Anda ingin melihat berapa banyak koneksi siaga yang Anda miliki yang memiliki transaksi terbuka, Anda dapat menggunakan:

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

Ini akan memberikan daftar koneksi terbuka yang dalam keadaan siaga, yang juga memiliki transaksi terbuka.

Karena itu, saya tidak dapat membuat kembali koneksi terbuka dalam keadaan siaga yang memiliki transaksi terbuka. Mungkin orang lain dapat memberikan detail tentang cara melakukan itu.

Max Vernon
sumber
3
Berhati-hatilah karena statekolom tersebut hanya ada di 9.2. Dan bagi saya sepertinya negara yang tepat adalah 'idle in transaction'.
dezso
1
Saya setuju dengan dezso.
franc
1
state = 'idle'tidak tidak menunjukkan transaksi terbuka.
a_horse_with_no_name
2
I cannot recreate an open connection in the idle state that has an open transaction. Buka dua koneksi ke database, dan ketik "mulai;" jadi satu. Di lain menjalankan kueri di atas, dan Anda akan memiliki idle in transaction.
X-Istence