Перейти к основному содержимому

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

примечание

Эта страница переведена при помощи нейросети GigaChat.

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

Каждая транзакция идентифицируется уникальным VirtualTransactionId (также называемым virtualXID или vxid), который состоит из номера процесса бэкенда (или procNumber) и последовательно назначаемого числа, локального для каждого бэкенда, известного как localXID. Например, виртуальный идентификатор транзакции 4/12532 имеет procNumber равный 4 и localXID равный 12532.

Не-виртуальные TransactionIdы (или xid), например, 278394, назначаются транзакциям последовательно из глобального счетчика, используемого всеми базами данных внутри кластера PostgreSQL. Это назначение происходит при первом записи транзакцией в базу данных. Это означает, что транзакции с меньшими номерами начали запись раньше транзакций с большими номерами. Обратите внимание, что порядок, в котором транзакции выполняют свою первую запись в базу данных, может отличаться от порядка, в котором были запущены транзакции, особенно если транзакция была начата с операторов, выполняющих только чтение базы данных.

Внутренний тип идентификатора транзакции xid имеет ширину 32 бит и циклически повторяется каждые 4 миллиарда транзакций. При каждом цикле увеличивается значение эпохи размером 32 бита. Также существует тип xid8 шириной 64 бита, включающий эту эпоху и поэтому не подверженный цикличности за время жизни установки; его можно преобразовать в xid путем приведения типа. Функции из таблицы «Функции информации о идентификаторах транзакций и снимках состояния» возвращают значения xid8. Идентификаторы транзакций используются в качестве основы механизма управления параллельностью PostgreSQL по методу MVCC и потоковой репликации.

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

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