74.1. Транзакции и идентификаторы #
Транзакции могут создаваться явным образом командой BEGIN
или START TRANSACTION
и завершаться командой COMMIT
или ROLLBACK
. SQL-операторы вне явного блока транзакций автоматически обрабатываются в виде транзакций, состоящих из одного оператора.
Каждой транзакции присваивается уникальный идентификатор VirtualTransactionId
(также именуемый virtualXID
или vxid
), который состоит из идентификатора обслуживающего процесса (или backendID
) и последовательно назначаемого номера — внутреннего для такого обслуживающего процесса (или localXID
). Например, виртуальный идентификатор 4/12532
состоит из следующих компонентов: backendID
со значением 4
и localXID
со значением 12532
.
Невиртуальные идентификаторы TransactionId
(или xid
), например 278394
, последовательно выбираются для транзакций из глобального счётчика, который используется всеми базами данных в рамках кластера Postgres Pro. Значение присваивается при первой операции записи транзакции в базу данных. Это означает, что транзакции с меньшими xid начинают запись раньше транзакций с большими xid. Обратите внимание, что порядок, в котором транзакции выполняют запись в базу данных впервые, может отличаться от порядка, в котором они запускаются, особенно если транзакции начинаются с операторов, выполняющих только операции чтения.
В Postgres Pro Enterprise используется 64-битный тип xid
внутреннего идентификатора (ID) транзакции, чтобы предотвратить зацикливание идентификатора транзакции. Каждый заголовок кортежа содержит два XID, поэтому их увеличение приводило бы к большим издержкам. По этой причине при сохранении на диске XID кортежей являются 32-битными, но каждая специальная область страницы содержит смещение, называемое базовый XID. Когда кортеж считывается в память, базовый XID добавляется к его 32-битным XID, и оба XID в кортеже становятся 64-битными, поэтому кортеж становится так называемым «кортежем в памяти». Полные 64-битные XID, полученные после добавления базового XID, используются при сравнении и в других арифметических операциях. В некоторых контекстах также используется xid8
. Функции в Таблица 9.81 возвращают значения xid8
. XID используются в качестве основы для механизма параллельного выполнения MVCC Postgres Pro и потоковой репликации.
Когда транзакция верхнего уровня с (невиртуальным) xid фиксируется, она помечается как зафиксированная в каталоге pg_xact
. Дополнительная информация записывается в каталог pg_commit_ts
при включённом параметре track_commit_timestamp.
Помимо того, что с подготовленными транзакциями сопоставляются определённые значения vxid
и xid
, им также назначаются глобальные идентификаторы транзакций (GID). GID представляет собой строковый литерал длиной до 200 байт, который должен иметь уникальное значение среди других существующих подготовленных транзакций. Сопоставление GID с идентификаторами транзакций представлено в pg_prepared_xacts
.