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.