Ini adalah jawaban Postgres umum, dan tidak khusus untuk heroku
(Jawaban bodoh sederhana untuk pertanyaan ini mungkin ... restart saja postgresql. Dengan asumsi itu bukan pilihan yang diinginkan atau bukan ...)
Temukan PID dengan menjalankan sql ini:
SELECT pid , query, * from pg_stat_activity
WHERE state != 'idle' ORDER BY xact_start;
(Kueri mungkin perlu diperbaiki tergantung pada versi postgres - akhirnya, cukup pilih * dari pg_stat_activity). Anda akan menemukan pid di kolom pertama (kiri), dan baris pertama (atas) kemungkinan adalah kueri yang ingin Anda hentikan. Saya akan menganggap pid adalah 1234 di bawah ini.
Anda dapat membatalkan kueri melalui SQL (yaitu tanpa akses shell) selama itu milik Anda atau Anda memiliki akses pengguna super:
select pg_cancel_backend(1234);
Itu adalah permintaan "ramah" untuk membatalkan kueri 1234, dan dengan sedikit keberuntungan itu akan hilang setelah beberapa saat. Akhirnya, ini lebih efisien:
select pg_terminate_backend(1234);
Jika Anda memiliki akses shell dan izin root atau postgres, Anda juga dapat melakukannya dari shell. Untuk "membatalkan" seseorang dapat melakukan:
kill -INT 1234
dan untuk "mengakhiri", cukup:
kill 1234
JANGAN:
kill -9 1234
... yang sering mengakibatkan seluruh server postgres terbakar, maka Anda sebaiknya memulai ulang postgres. Postgres cukup kuat, sehingga data tidak akan rusak, tetapi saya sarankan untuk tidak menggunakan "kill -9" dalam hal apa pun :-)
"Diam dalam transaksi" yang bertahan lama sering kali berarti bahwa transaksi tidak dihentikan dengan "komit" atau "kembalikan", yang berarti bahwa aplikasi tersebut bermasalah atau tidak dirancang dengan benar untuk bekerja dengan basis data transaksional. "Diam dalam transaksi" yang tahan lama harus dihindari, karena juga dapat menyebabkan masalah kinerja yang besar.