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