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