5

Если хранимая процедура выходит из строя в середине, изменения в этой точке от начала SP отскакивают назад неявно или нам нужно написать какой-либо явный код, чтобы убедиться, что SP работает только в транзакции базы данных?Выполнены ли хранимые процедуры в транзакции базы данных в Postgres?

+0

Возможный дубликат [Выполнять хранимую процедуру postgreSQL как одну транзакцию] (http://stackoverflow.com/questions/26406111/execute-postgresql-stored-procedure-as-one-transaction) –

+0

Все описано в руководстве. Включая тот факт, что у вас нет технически хранимых процедур в PostgreSQL –

+0

Итак, есть ли у вас ответ? –

ответ

15

Строго говоря, Postgres в настоящее время (вплоть до версии 9.5) и не включает в себя имеют «хранимые процедуры», как определено в стандарте ANSI. Все делается с помощью «функций» вместо этого, которые обеспечивают почти ту же функциональность (и многое другое), поскольку другие СУБД предоставляют хранимые процедуры. Основное отличие заключается в обработке транзакций.

Functions являются атомное в Postgres и автоматически запускать внутри своей собственной транзакции, если не вызывается внутри внешней транзакции. Они всегда работают внутри одной транзакции и преуспевают или сбой полностью. Следовательно, нельзя начинать или совершать транзакции внутри функции. И такие команды, как VACUUM или CREATE INDEX CONCURRENTLY, которые не могут работать в транзакционном блоке, не допускаются.

Per documentation on PL/pgSQL:

Функция и процедура запуска всегда выполняется в пределах сделки, установленной с помощью внешнего запроса - они не могут начать или совершить эту сделку, так как не было бы для них контекста, чтобы выполнить в. Однако блок, содержащий EXCEPTION пункт , фактически образует субтранзакцию, которая может быть откат без , влияющих на внешнюю транзакцию.

Error handling:

По умолчанию любая ошибка, возникающая в функции PL/PgSQL прекращает выполнение функции, и в самом деле окружающей сделки , а также. Вы можете уловить ошибки и восстановить их, используя блок BEGIN с предложением EXCEPTION.

Есть специальные исключения, включая, но не ограничиваясь:

  • данных, записанных в лог-файлы
  • changes made to a sequence

    Важно: Некоторые типы данных PostgreSQL и функции имеют специальные правила r например, по отношению к транзакционному поведению. В частности, изменения, внесенные в последовательность (и, следовательно, счетчик столбца, объявленного с использованием serial) , сразу же отображаются для всех других транзакций и не свертываются , если транзакция, в результате которой произошли изменения, отменена.

  • подготовленные заявления

  • DBLink называет