Если хранимая процедура выходит из строя посередине, изменения в этой точке от начала SP отскакивают назад неявно или нам нужно написать какой-либо явный код, чтобы убедиться, что SP работает только в транзакции базы данных?
Выполняются ли хранимые процедуры в транзакции базы данных в Postgres?
Ответ 1
Строго говоря, у Postgres не было хранимых процедур, как это определено в стандарте ISO/IEC до версии 11. Термин часто неправильно используется для обозначения функций, которые предоставляют большую часть того же самого функциональность (и многое другое), которую предоставляют другие СУБД с помощью "хранимых процедур". Основным отличием является обработка транзакций.
Истинные хранимые процедуры наконец-то представлены в Postgres 11:
Функции являются атомарными в Postgres и автоматически запускаются внутри собственной транзакции, если не вызваны во внешней транзакции. Они всегда выполняются внутри одной транзакции и полностью или успешно завершаются. Следовательно, нельзя начинать или фиксировать транзакции внутри функции. А такие команды, как VACUUM
, CREATE DATABASE
или CREATE INDEX CONCURRENTLY
, которые не выполняются в контексте транзакции, не допускаются.
Функции и процедуры запуска всегда выполняются в пределах транзакция установлена внешним запросом - они не могут начать или совершить эту транзакцию, так как не было бы контекста для них выполнить в. Однако блок, содержащий предложение
EXCEPTION
эффективно формирует субтранзакцию, которую можно откатить без влияет на внешнюю транзакцию.
По умолчанию любая ошибка, возникающая в функции PL/pgSQL, прерывается выполнение функции и действительно окружающей транзакции также. Вы можете перехватывать ошибки и восстанавливать их, используя
BEGIN
блок с предложениемEXCEPTION
.
Есть исключения, в том числе:
- данные записываются в файлы журнала
изменения, внесенные в последовательность
Важно:. Некоторые типы данных и функции PostgreSQL имеют специальные правила. относительно транзакционного поведения. В частности, изменения, внесенные в последовательность (и, следовательно, счетчик столбца, объявленного с использованием
serial
) немедленно видны для всех других транзакций и не отображаются назад, если транзакция, которая внесла изменения, прерывается.готовые заявления
- SQL Fiddle демо
вызовы dblink (или аналогичные)