Перейти к основному содержимому

Подтранзакции

примечание

Эта страница переведена при помощи нейросети GigaChat.

Подтранзакции начинаются внутри транзакций, позволяя большим транзакциям разделяться на более мелкие единицы. Подтранзакции могут быть зафиксированы или прерваны, не влияя на их родительские транзакции, позволяя родительским транзакциям продолжаться. Это позволяет более легко обрабатывать ошибки, что является распространенной моделью разработки приложений. Слово «субтранзакция» часто сокращается до «subxact».

Подтранзакции могут быть запущены явно с помощью команды SAVEPOINT, но также могут быть запущены другими способами, например посредством предложения EXCEPTION языка PL/pgSQL. Языки PL/Python и PL/Tcl также поддерживают явные подтранзакции. Подтранзакции можно также запускать в других подтранзакциях. Транзакция верхнего уровня и ее дочерние подтранзакции формируют иерархию или дерево, поэтому по отношению к основной транзакции используется термин «транзакция верхнего уровня».

Если субтранзакции присваивается не виртуальный идентификатор транзакции, ее идентификатор транзакции называется «subxid». Подтранзакциям, доступным только для чтения, не присваиваются subxid, но как только они пытаются записать, им назначается один. Это также приводит к тому, что всем родителям subxid, вплоть до транзакции верхнего уровня и включая ее, присваиваются не виртуальные идентификаторы транзакций. Значение xid родительской транзакции всегда будет меньше значений subxid подтранзакций.

Непосредственный родительский xid каждого subxid записывается в каталоге pg_subtrans. Запись не делается для xids верхнего уровня, поскольку у них нет родителя, и запись не делается для подтранзакций, доступных только для чтения.

Когда субтранзакция фиксируется, все ее фиксированные дочерние субтранзакции с субксидами также будут считаться фиксированными в этой транзакции. Когда субтранзакция прерывается, все ее дочерние субтранзакции также будут считаться прерванными.

Когда транзакция верхнего уровня с фиксацией xid фиксируется, все ее дочерние транзакции также постоянно записываются как фиксированные в каталоге pg_xact. Если транзакция верхнего уровня прерывается, все ее дочерние транзакции также прерываются, даже если они были фиксированы в качестве дочерних.

Чем больше субтранзакций каждая транзакция держит открытыми (не откатывается и не выпускается), тем больше накладных расходов на управление транзакциями. До 64 открытых subxid кешируются в общей памяти для каждого бэкенда; после этого накладные расходы на ввод/вывод в хранилище значительно возрастают из-за дополнительных поисков записей subxid в pg_subtrans.