Da ich aus der MS SQL-Welt komme, neige ich dazu, häufig gespeicherte Prozeduren zu verwenden. Ich schreibe gerade eine Anwendung, die viele PostgreSQL plpgsql-Funktionen verwendet. Ich möchte alle INSERTS/UPDATES, die in einer bestimmten Funktion enthalten sind, zurücksetzen, wenn ich an irgendeiner Stelle eine Ausnahme erhalte.
Ursprünglich hatte ich den Eindruck, dass jede Funktion in eine eigene Transaktion eingeschlossen ist und dass eine Ausnahme automatisch alles rückgängig machen würde. Das scheint jedoch nicht der Fall zu sein. Ich frage mich, ob ich stattdessen Savepoints in Kombination mit Ausnahmebehandlung verwenden sollte? Aber ich verstehe nicht wirklich den Unterschied zwischen einer Transaktion und einem Savepoint, um zu wissen, ob dies der beste Ansatz ist. Haben Sie einen Rat für mich?
CREATE OR REPLACE FUNCTION do_something(
_an_input_var int
) RETURNS bool AS $$
DECLARE
_a_variable int;
BEGIN
INSERT INTO tableA (col1, col2, col3)
VALUES (0, 1, 2);
INSERT INTO tableB (col1, col2, col3)
VALUES (0, 1, 'whoops! not an integer');
-- The exception will cause the function to bomb, but the values
-- inserted into "tableA" are not rolled back.
RETURN True;
END; $$ LANGUAGE plpgsql;