Di Postgres, bagaimana cara mendapatkan daftar savepoint yang didefinisikan saat ini?

13

Saya menggunakan SAVEPOINT postgres yang membuat savepoint baru dalam transaksi saat ini, dan ingin menampilkan daftar savepoint yang saat ini didefinisikan dalam suatu koneksi.

Untuk lebih tepatnya: Saya ingin memeriksa nama yang TIDAK akan memicu kesalahan "tidak ada savepoint" dalam koneksi.

vaab
sumber

Jawaban:

8

Pertanyaan menarik! Jawaban singkat: tidak .

Jawaban panjang: tampaknya tidak ada cara yang ada untuk mendapatkan daftar savepoint yang ditentukan. Lebih buruk lagi, tampaknya tidak mungkin untuk membuat ekstensi PostgreSQL yang akan membiarkan Anda melakukan ini: melihat src / backend / access / transam / xact.c , Anda dapat melihat bahwa fungsi-fungsi seperti RollbackToSavepoint (di situlah "tidak seperti itu" savepoint "pesan kesalahan yang Anda sebutkan berasal) bergantung pada variabel CurrentTransactionState, yang dinyatakan statis untuk xact.c, yaitu tidak akan terlihat secara global ke kode ekstensi.

Sekarang, jika Anda berani dan sangat ingin membuat daftar savepoints yang ditentukan dari sisi server (bukan hanya mengingat klien Anda ...), Anda bisa menambahkan fungsi pembantu ke xact.c yang akan menampilkan ini informasi untuk Anda. Bahkan, di sini hanya tambalan seperti itu . Itu tambalan yang sangat kasar untuk tujuan ilustrasi saja, dan hanya elogs nama savepoint, itu harus benar-benar mengembalikan nama-nama tersebut sebagai setof teks.

Mengenai mengapa fitur ini hilang, saya menduga bahwa tidak ada use case yang masuk akal untuk klien yang perlu mengambil daftar savepoints yang ditentukan dari server. Apa yang akan dilakukan klien dengan daftar ini - cukup pilih satu saja dan secara acak ROLLBACK? ROLLBACKke yang terakhir secara membabi buta? Savepoints AFAICT hanya berguna jika klien mengingat apa yang telah didefinisikan savepoint dan di mana mereka berada untuk dapat memanfaatkannya.

Josh Kupershmidt
sumber
Terima kasih atas jawaban ini. Klien harus ingat tentu saja, tetapi dalam kasus akses multi-utas yang rumit ke satu koneksi, ini akan membantu untuk men-debug kode klien! Dan lebih banyak informasi yang dapat diakses seringkali lebih baik daripada lebih sedikit IMHO.
vaab
Ya, untuk menjalankan kode itu tidak masuk akal. Tetapi untuk debugging akan sangat membantu untuk melihat savepoint mana yang terbuka. Terima kasih atas jawaban Anda.
guettli