как использовать COMMIT и ROLLBACK в функции PostgreSQL

Вопрос: Я использую три оператора insert, и если в третьем выражении есть ошибка, я хочу откат первого и второго. Если нет способа сделать это, пожалуйста, скажите мне другой подход, чтобы справиться с этим в PostgresqQL. Если я использую COMMIT или ROLLBACK, я получаю сообщение об ошибке. CREATE OR REPLACE FUNCTION TEST1 () RETURNS VOID LANGUAGE

Вопрос:

Я использую три оператора insert, и если в третьем выражении есть ошибка, я хочу откат первого и второго. Если нет способа сделать это, пожалуйста, скажите мне другой подход, чтобы справиться с этим в PostgresqQL.

Если я использую COMMIT или ROLLBACK, я получаю сообщение об ошибке.

CREATE OR REPLACE FUNCTION TEST1 () RETURNS VOID LANGUAGE ‘plpgsql’ AS $$ BEGIN INSERT INTO table1 VALUES (1); INSERT INTO table1 VALUES (2); INSERT INTO table1 VALUES (‘A’); COMMIT; EXCEPTION WHEN OTHERS THEN ROLLBACK; END;$$;

Вышеприведенный код не работает; COMMIT и ROLLBACK не поддерживаются функциями PostgreSQL.

Лучший ответ:

Вы не можете использовать операторы транзакций, такие как SAVEPOINT, COMMIT или ROLLBACK в функции.

BEGIN который запускает блок в PL/pgSQL, отличается от инструкции BEGIN SQL, которая запускает транзакцию.

Просто удалите COMMIT из своей функции, и у вас есть решение: поскольку вся функция всегда выполняется внутри одной транзакции, любая ошибка в третьем выражении приведет к ROLLBACK который также отменяет первые два оператора.

Оцените статью
Добавить комментарий