Pembaruan PostgreSQL 12 :ada dukungan terbatas untuk PROCEDURE
tingkat atas s yang dapat melakukan kontrol transaksi. Anda masih tidak dapat mengelola transaksi dalam fungsi SQL-callable biasa, jadi di bawah ini tetap benar kecuali saat menggunakan prosedur tingkat atas yang baru.
Fungsi adalah bagian dari transaksi tempat mereka dipanggil. Efeknya dibatalkan jika transaksi dibatalkan. Pekerjaan mereka berkomitmen jika transaksi dilakukan. BEGIN ... EXCEPT
blok dalam fungsi beroperasi seperti (dan di bawah tenda menggunakan) savepoints seperti SAVEPOINT
dan ROLLBACK TO SAVEPOINT
Pernyataan SQL.
Fungsi berhasil secara keseluruhan atau gagal secara keseluruhan, kecuali BEGIN ... EXCEPT
penanganan kesalahan. Jika kesalahan muncul dalam fungsi dan tidak ditangani, transaksi yang memanggil fungsi dibatalkan. Transaksi yang dibatalkan tidak dapat dilakukan, dan jika mereka mencoba melakukan COMMIT
diperlakukan sebagai ROLLBACK
, sama seperti untuk transaksi lain yang salah. Perhatikan:
regress=# BEGIN;
BEGIN
regress=# SELECT 1/0;
ERROR: division by zero
regress=# COMMIT;
ROLLBACK
Lihat bagaimana transaksi, yang berada dalam status kesalahan karena pembagian nol, kembali ke COMMIT
?
Jika Anda memanggil fungsi tanpa transaksi sekitarnya yang eksplisit, aturannya persis sama dengan pernyataan Pg lainnya:
BEGIN;
SELECT refresh_materialized_view(name);
COMMIT;
(di mana COMMIT
akan gagal jika SELECT
menimbulkan kesalahan).
PostgreSQL tidak (belum) mendukung transaksi otonom dalam fungsi, di mana prosedur/fungsi dapat melakukan/mengembalikan secara independen dari transaksi panggilan. Ini dapat disimulasikan menggunakan sesi baru melalui dblink.
TAPI , hal-hal yang bukan transaksional atau transaksional yang tidak sempurna ada di PostgreSQL. Jika memiliki perilaku non-transaksional dalam BEGIN; do stuff; COMMIT;
blok, ia memiliki perilaku non-transaksional dalam suatu fungsi juga. Misalnya, nextval
dan setval
, TRUNCATE
, dll.