Если хранимая процедура выходит из строя в середине, изменения в этой точке от начала SP отскакивают назад неявно или нам нужно написать какой-либо явный код, чтобы убедиться, что SP работает только в транзакции базы данных?Выполнены ли хранимые процедуры в транзакции базы данных в Postgres?
ответ
Строго говоря, Postgres в настоящее время (вплоть до версии 9.5) и не включает в себя имеют «хранимые процедуры», как определено в стандарте ANSI. Все делается с помощью «функций» вместо этого, которые обеспечивают почти ту же функциональность (и многое другое), поскольку другие СУБД предоставляют хранимые процедуры. Основное отличие заключается в обработке транзакций.
Functions являются атомное в Postgres и автоматически запускать внутри своей собственной транзакции, если не вызывается внутри внешней транзакции. Они всегда работают внутри одной транзакции и преуспевают или сбой полностью. Следовательно, нельзя начинать или совершать транзакции внутри функции. И такие команды, как VACUUM
или CREATE INDEX CONCURRENTLY
, которые не могут работать в транзакционном блоке, не допускаются.
Per documentation on PL/pgSQL:
Функция и процедура запуска всегда выполняется в пределах сделки, установленной с помощью внешнего запроса - они не могут начать или совершить эту сделку, так как не было бы для них контекста, чтобы выполнить в. Однако блок, содержащий
EXCEPTION
пункт , фактически образует субтранзакцию, которая может быть откат без , влияющих на внешнюю транзакцию.
По умолчанию любая ошибка, возникающая в функции PL/PgSQL прекращает выполнение функции, и в самом деле окружающей сделки , а также. Вы можете уловить ошибки и восстановить их, используя блок
BEGIN
с предложениемEXCEPTION
.
Есть специальные исключения, включая, но не ограничиваясь:
- данных, записанных в лог-файлы
-
Важно: Некоторые типы данных PostgreSQL и функции имеют специальные правила r например, по отношению к транзакционному поведению. В частности, изменения, внесенные в последовательность (и, следовательно, счетчик столбца, объявленного с использованием
serial
) , сразу же отображаются для всех других транзакций и не свертываются , если транзакция, в результате которой произошли изменения, отменена. подготовленные заявления
- SQL Fiddle демо
DBLink называет
Возможный дубликат [Выполнять хранимую процедуру postgreSQL как одну транзакцию] (http://stackoverflow.com/questions/26406111/execute-postgresql-stored-procedure-as-one-transaction) –
Все описано в руководстве. Включая тот факт, что у вас нет технически хранимых процедур в PostgreSQL –
Итак, есть ли у вас ответ? –