73.3. Подтранзакции #
Подтранзакции запускаются внутри транзакций и позволяют разбивать более крупные транзакции на составляющие. Подтранзакции могут фиксироваться или прерываться, не влияя на родительские транзакции, которые, соответственно, могут продолжать выполняться. Такое решение позволяет обрабатывать ошибки проще и часто используется при разработке приложений. В английском языке слово подтранзакция зачастую сокращается до subxact.
Подтранзакции могут явным образом запускаться как при помощи команды SAVEPOINT
, так и другими способами, например посредством предложения EXCEPTION
языка PL/pgSQL. Языки PL/Python и PL/Tcl также поддерживают явные подтранзакции. Подтранзакции можно также запускать в других подтранзакциях. Транзакция верхнего уровня и её дочерние подтранзакции формируют иерархию или дерево, поэтому по отношению к основной транзакции используется термин «транзакция верхнего уровня».
Если подтранзакции присвоен невиртуальный идентификатор (ID) транзакции, её идентификатор транзакции называется «subxid». В Postgres Pro Enterprise subxid являются 64-битными. Подтранзакциям, доступным только для чтения, не назначаются subxid, но сразу после операции записи им будет присвоен один из них. Операция записи также приводит к тому, что всем родителям subxid, вплоть до транзакции верхнего уровня, будут присвоены невиртуальные идентификаторы транзакций. Родительский XID всегда меньше любого из его дочерних subxid.
Идентификатор непосредственного родителя каждой подтранзакции записывается в каталог pg_subtrans
. Идентификаторы транзакций верхнего уровня не записываются, поскольку у них нет родителя. Также не записываются и идентификаторы подтранзакций в режиме только чтения.
При фиксации подтранзакции все зафиксированные дочерние подтранзакции с subxid также считаются зафиксированными в рамках этой подтранзакции. При прерывании подтранзакции все дочерние подтранзакции также считаются прерванными.
При фиксации транзакции верхнего уровня с xid зафиксированные подтранзакции записываются как зафиксированные в подкаталоге pg_xact
. При прерывании транзакции верхнего уровня все её подтранзакции также прерываются, даже если они были зафиксированы.
Чем больше подтранзакций остаётся открытыми в каждой транзакции (в отношении которых не выполнен откат или освобождение), тем выше будут издержки, связанные с управлением транзакциями. До 64 открытых subxid кешируется в общей памяти для каждого сервера. После этого этапа издержки хранения для операций ввода/вывода существенно возрастают из-за дополнительных операций поиска записей о subxid в pg_subtrans
.