20
Вложенные транзакции
Собственный номер и статус в CLOG
конечный статус зависит от статуса основной транзакции
Информация о вложенности сохраняется на диске
каталог PGDATA/pg_subtrans
данные кешируются в буферах общей памяти (аналогично CLOG)
Примеры использования
точка сохранения SAVEPOINT
обработка исключений в PL/pgSQL (EXCEPTION)
режим psql ON_ERROR_ROLLBACK = on/interactive
Вложенные транзакции имеют свой номер (бóльший, чем номер
основной транзакции). Статус вложенных транзакций записывается
обычным образом в CLOG, однако финальный статус зависит от
статуса основной транзакции: если она отменена, то отменяются также
и все вложенные транзакции.
Информация о вложенности транзакций хранится в каталоге
PGDATA/pg_subtrans. Обращение к файлам происходит через буферы
в общей памяти сервера, организованные так же, как и буферы CLOG.
Вложенные транзакции нельзя использовать явно, то есть нельзя
начать новую транзакцию, не завершив текущую. Этот механизм
задействуется неявно при использовании точек сохранения, при
обработке исключений PL/pgSQL и т. п.
Особенный интерес представляет режим ON_ERROR_ROLLBACK
в psql, при включении которого транзакция, выполнившая ошибочную
операцию, не прерывается, а продолжает работать. Почему этот режим
не включен по умолчанию? Дело в том, что ошибка может произойти
где-то в середине выполнения оператора, и таким образом нарушится
атомарность выполнения оператора. Единственный способ отменить
изменения, уже сделанные этим оператором, не трогая остальные
изменения — использовать вложенные транзакции. Поэтому режим
ON_ERROR_ROLLBACK фактически ставит перед каждой командой
неявную точку сохранения. А это чревато существенными накладными
расходами.