Исходя из мира MS SQL, я стараюсь активно использовать хранимые процедуры. В настоящее время я пишу приложение, использующее множество функций PostgreSQL plpgsql. То, что я хотел бы сделать, - откат всех INSERTS/UPDATES, содержащихся в определенной функции, если я получаю исключение в любой точке внутри него.
Первоначально у меня создалось впечатление, что каждая функция заверяется в свою собственную транзакцию и что исключение автоматически откатывает все. Однако, похоже, это не так. Мне интересно, если я должен использовать точки сохранения в сочетании с обработкой исключений? Но я не понимаю разницу между транзакцией и точкой сохранения, чтобы знать, подходит ли это наилучший подход. Любые советы, пожалуйста?
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;