66.1. Транзакции и идентификаторы #

Транзакции могут создаваться явным образом командой BEGIN или START TRANSACTION и завершаться командой COMMIT или ROLLBACK. SQL-операторы вне явного блока транзакций автоматически обрабатываются в виде транзакций, состоящих из одного оператора.

Каждой транзакции присваивается уникальный идентификатор VirtualTransactionId (также именуемый virtualXID или vxid), который состоит из идентификатора обслуживающего процесса (или procNumber) и последовательно назначаемого номера — внутреннего для такого обслуживающего процесса (или localXID). Например, виртуальный идентификатор 4/12532 состоит из следующих компонентов: procNumber со значением 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.82 возвращают значения xid8. XID используются в качестве основы для механизма параллельного выполнения MVCC Postgres Pro и потоковой репликации.

Когда транзакция верхнего уровня с (невиртуальным) xid фиксируется, она помечается как зафиксированная в каталоге pg_xact. Дополнительная информация записывается в каталог pg_commit_ts при включённом параметре track_commit_timestamp.

Помимо того, что с подготовленными транзакциями сопоставляются определённые значения vxid и xid, им также назначаются глобальные идентификаторы транзакций (GID). GID представляет собой строковый литерал длиной до 200 байт, который должен иметь уникальное значение среди других существующих подготовленных транзакций. Сопоставление GID с идентификаторами транзакций представлено в pg_prepared_xacts.