F.13. csn — расширение для номера последовательности фиксации (Commit Sequence Number)#

F.13. csn — расширение для номера последовательности фиксации (Commit Sequence Number)

F.13. csn — расширение для номера последовательности фиксации (Commit Sequence Number) #

Версия: 1.0

F.13.1. Обзор #

Расширение csn предоставляет функции для получения номера последовательности фиксации (CSN), связанного с транзакциями и снимками. CSN — это монотонно увеличивающийся идентификатор, присваиваемый в момент фиксации транзакции, обеспечивающий полную упорядоченность зафиксированных транзакций.

Это расширение предназначено для дистрибутивов, реализующих MVCC на основе CSN. В первую очередь оно полезно для диагностики, отладки и анализа видимости.

F.13.2. Обоснование #

Традиционная MVCC на основе XID опирается на идентификаторы транзакций (XID) и снимки для определения видимости. MVCC на основе CSN улучшает эту модель, назначая глобальный порядок фиксации, что упрощает проверки видимости и снижает конкуренцию в условиях высокой параллельности.

Расширение csn предоставляет этот функционал в SQL, позволяя пользователям:

  • Проверять порядок фиксации транзакций.

  • Анализировать границы видимости снимка.

  • Проводить отладку поведения параллелизма.

  • Проводить исследование MVCC-систем, основанных на CSN.

F.13.3. Установка #

Чтобы установить расширение, убедитесь, что оно было скомпилировано и установлено в каталог расширений. Затем включите его в нужной базе данных:

CREATE EXTENSION csn;

Чтобы удалить расширение:

DROP EXTENSION csn;

F.13.4. Быстрый старт #

Получить CSN текущей транзакции:

SELECT pg_csn(pg_current_xact_id());

Получить CSN, связанный с текущим снимком:

SELECT pg_snapshot_csn(pg_current_snapshot());

Интерфейсы, совместимые с устаревшими версиями:

SELECT txid_csn(txid_current());
SELECT txid_snapshot_csn(txid_current_snapshot());

F.13.5. Функции #

ФункцияТип возвращаемого значенияОписание
pg_csn(xid xid8)bigintВозвращает CSN транзакции.
pg_snapshot_csn(snapshot pg_snapshot)bigintВозвращает CSN, соответствующий снимку.
txid_csn(xid bigint)bigintОбёртка совместимости для pg_csn.
txid_snapshot_csn(snapshot txid_snapshot)bigintОбёртка совместимости для pg_snapshot_csn.

Современные приложения должны предпочитать функции pg_*.

F.13.6. Использование #

F.13.6.1. Пример: получение CSN текущей транзакции #

SELECT pg_csn(pg_current_xact_id());

F.13.6.2. Пример: получение CSN снимка #

SELECT pg_snapshot_csn(pg_current_snapshot());

F.13.6.3. Пример: определение порядка фиксации #

BEGIN;
INSERT INTO test VALUES (1);
COMMIT;

SELECT pg_csn(pg_current_xact_id());

F.13.6.4. Совместимость с устаревшими версиями #

SELECT txid_csn(txid_current());
SELECT txid_csn(txid_current() - 4);
SELECT txid_snapshot_csn(txid_current_snapshot());

F.13.7. Пример вывода #

 pg_csn
--------
      42

Пример снимка:

 pg_snapshot_csn
-----------------
              42

Специальные значения:

 pg_csn
--------
       3

Это соответствует CSN_FROZEN.

 pg_csn
--------
       0

Это соответствует CSN_INPROGRESS.

F.13.8. Возвращаемые значения #

Все функции возвращают номер последовательности фиксации (CSN) типа bigint. Результат зависит от состояния и возраста транзакции.

Возвращаемое значениеОписание
Обычный CSN (≥ 4)Обозначает успешно зафиксированную транзакцию.
CSN_FROZENВозвращается для загрузочных, замороженных или очень старых зафиксированных транзакций.
CSN_ABORTEDУказывает, что транзакция была прервана.
CSN_INPROGRESSУказывает, что транзакция находится в процессе выполнения.
CSN_COMMITTINGУказывает, что транзакция сейчас фиксируется.

Для транзакций старше TransactionXmin CSN может больше не храниться в pg_csnlog. В таких случаях статус определяется из pg_xact, и зафиксированные транзакции возвращают CSN_FROZEN.

TransactionXmin — это самый старый xmin среди всех активных backend-процессов, это глобальный MVCC-горизонт, обеспечивающий безопасное усечение глобальных метаданных, таких как pg_subtrans и pg_csnlog.

F.13.9. Числовое представление значений CSN #

CSN представлены в виде беззнаковых 64-битных целых чисел.

КонстантаЧисловое значениеОписание
CSN_INPROGRESS0Транзакция все еще выполняется.
CSN_ABORTED1Транзакция была прервана.
CSN_COMMITTING2Транзакция фиксируется (внутреннее использование).
CSN_FROZEN3Замороженная или очень старая зафиксированная транзакция.
CSN_FIRST_NORMAL4Первый допустимый CSN, присвоенный зафиксированной транзакции.
CSN_MAX_NORMAL2⁶³ − 1Максимально допустимый CSN в нормальном режиме работы.

F.13.10. Ограничения #

  • Расширение требует сборки с поддержкой MVCC на основе CSN.

  • Не поддерживается без инфраструктуры CSN.

  • В SQL не поддерживаются арифметические операции с xid8.

  • Внутренние состояния CSN, такие как CSN_INPROGRESS, не отображаются пользователям.

  • Результаты зависят от доступности журналов CSN (pg_csnlog).

F.13.11. Совместимость #

Современные интерфейсы:

  • pg_csn(xid8)

  • pg_snapshot_csn(pg_snapshot)

Интерфейсы для обеспечения совместимости с устаревшими версиями:

  • txid_csn(bigint)

  • txid_snapshot_csn(txid_snapshot)