sql >> Databáze >  >> RDS >> PostgreSQL

Jsou funkce PostgreSQL transakční?

Aktualizace PostgreSQL 12 :podpora PROCEDURE nejvyšší úrovně je omezená s, které mohou provádět kontrolu transakcí. Stále nemůžete spravovat transakce v běžných funkcích s možností volání SQL, takže níže uvedené zůstává pravdivé, s výjimkou použití nových procedur nejvyšší úrovně.

Funkce jsou součástí transakce, ze které jsou volány. Jejich účinky se odvolají, pokud se transakce vrátí zpět. Jejich práce se zavazuje, pokud se transakce zavazuje. Jakékoli BEGIN ... EXCEPT bloky ve funkci fungují jako (a pod kapotou používají) body uložení, jako je SAVEPOINT a ROLLBACK TO SAVEPOINT SQL příkazy.

Funkce buď uspěje jako celek, nebo selže jako celek, s výjimkou BEGIN ... EXCEPT vypořádání se s chybou. Pokud je ve funkci vyvolána chyba a není zpracována, transakce volající funkci se přeruší. Přerušené transakce nemohou potvrdit, a pokud se pokusí potvrdit, COMMIT je považováno za ROLLBACK stejně jako u jakékoli jiné chybné transakce. Všimněte si:

regress=# BEGIN;
BEGIN
regress=# SELECT 1/0;
ERROR:  division by zero
regress=# COMMIT;
ROLLBACK

Podívejte se, jak se transakce, která je v chybovém stavu kvůli nulovému dělení, vrátí zpět na COMMIT ?

Pokud zavoláte funkci bez explicitní okolní transakce, pravidla jsou přesně stejná jako pro jakýkoli jiný příkaz Pg:

BEGIN;
SELECT refresh_materialized_view(name);
COMMIT;

(kde COMMIT selže, pokud SELECT vyvolalo chybu).

PostgreSQL (zatím) nepodporuje autonomní transakce ve funkcích, kde by se procedura/funkce mohla potvrdit/vrátit nezávisle na volající transakci. To lze simulovat pomocí nové relace přes dblink.

ALE V PostgreSQL existují věci, které nejsou transakční nebo jsou nedokonale transakční. Pokud má netransakční chování v normálním BEGIN; do stuff; COMMIT; blok, má také netransakční chování ve funkci. Například nextval a setval , TRUNCATE , atd.



  1. Oracle SQL PIVOT Table

  2. Analyzujte XML na SQL Server

  3. Lehké nákupní dobrodružství

  4. Jak šifrovat data v Oracle pomocí PL SQL