PostgreSQL: откат транзакции внутри функции plpgsql? - PullRequest
10 голосов
/ 11 марта 2010

Исходя из мира 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;

Ответы [ 4 ]

14 голосов
/ 11 марта 2010

Функция представляет транзакцию. Вам не нужно переносить функцию в BEGIN / COMMIT.

4 голосов
/ 14 марта 2012

Вы не можете использовать команду commit или rollback в функции, но вы можете использовать свою функцию в совершенной транзакции,

НАЧАЛО СДЕЛКИ; ВЫБЕРИТЕ do_something (); COMMIT;

Этот сценарий SQL фиксируется только в том случае, если в do_something нет исключений, тогда он будет откатывать транзакцию функции.

1 голос
/ 11 марта 2010

Точки сохранения могут использоваться для эмуляции вложенных транзакций. Поскольку транзакция postgresql - это последовательность операторов, которые будут применяться или отбрасываться, точки сохранения могут помечать точки в этой последовательности, которые позволяют откат к.

Поскольку истинные вложенные транзакции не поддерживаются, это ваша лучшая ставка (и при этом хорошая).

1 голос
/ 11 марта 2010

документы говорят это:

Точка сохранения - это специальная отметка внутри транзакции, которая позволяет откатить все команды, которые были выполнены после ее создания, восстанавливаясостояние транзакции до того, что было на момент сохранения.

Они также приводят примеры.

Редактировать:

Вам необходимо заключить транзакцию в BEGIN и COMMITкоманды.

транзакция устанавливается путем окружения команд SQL транзакции командами BEGIN и COMMIT

...