PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Apakah fungsi PostgreSQL bersifat transaksional?

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Memesan hasil model bersarang yang penuh semangat di Node Sequelize

  2. Cara Memperbarui Banyak Kolom di PostgreSQL

  3. Mengimpor file CSV zip ke PostgreSQL

  4. Indeks Sebagian tidak digunakan dalam klausa ON CONFLICT saat melakukan upsert di Postgresql

  5. PG::Error:SELECT DISTINCT, ORDER BY ekspresi harus muncul di daftar pilih