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