71.3. Подтранзакции#
71.3. Подтранзакции #
Подтранзакции запускаются внутри транзакций, позволяя разбивать большие транзакции на более мелкие единицы. Подтранзакции могут фиксироваться или откатываться без влияния на родительские транзакции, что позволяет родительским транзакциям продолжаться. Это позволяет легче обрабатывать ошибки, что является распространенным шаблоном разработки приложений. Слово подтранзакция часто сокращается как subxact.
Подтранзакции могут быть начаты явно с помощью команды
SAVEPOINT
, но также могут быть начаты и
другими способами, такими как конструкция EXCEPTION
в PL/pgSQL.
PL/Python и PL/Tcl также поддерживают явные подтранзакции.
Подтранзакции также могут быть начаты из других подтранзакций.
Транзакция верхнего уровня и её дочерние подтранзакции образуют
иерархию или дерево, поэтому мы называем основную транзакцию
транзакцией верхнего уровня.
Если подтранзакции присваивается не виртуальный идентификатор транзакции, её идентификатор транзакции называется “subxid”. Подтранзакциям только для чтения не присваиваются subxid, но как только они попытаются записать, им будет присвоен subxid. Это также вызывает присвоение не виртуальных идентификаторов транзакций всем родителям subxid, вплоть до транзакции верхнего уровня. Мы гарантируем, что идентификатор родительской транзакции всегда ниже любого из её дочерних subxid.
Немедленный родительский xid каждого subxid записывается в
pg_subtrans
директорию. Запись не создается для
верхнеуровневых xid, так как у них нет родителя, а также запись не создается
для субтранзакций только для чтения.
Когда подтранзакция завершается, все её завершённые дочерние подтранзакции с subxids также будут считаться подзавершёнными в этой транзакции. Когда подтранзакция прерывается, все её дочерние подтранзакции также будут считаться прерванными.
Когда верхнеуровневая транзакция с xid фиксируется, все её
подфиксированные дочерние подтранзакции также постоянно записываются
как зафиксированные в подкаталоге pg_xact
. Если
верхнеуровневая транзакция прерывается, все её подтранзакции также прерываются,
даже если они были подфиксированы.
Чем больше подтранзакций каждая транзакция оставляет открытыми (не
откатывает или не освобождает), тем больше накладные расходы на управление транзакциями. До 64 открытых subxids кэшируются в общей памяти для
каждого бэкенда; после этого момента накладные расходы на ввод-вывод хранилища значительно увеличиваются из-за дополнительных поисков записей subxid в
pg_subtrans
.