Помимо обычных столбцов в таблицах Postgres также доступны различные системные столбцы . Один из них xmin
хранит идентификатор транзакции, использованный для создания строки. Его тип данных - xid
четырехбайтовое целое число, которое оборачивается в какой-то момент (т.е. не обязательно уникально). Функция, txid_current()
в свою очередь, возвращает идентификатор текущей транзакции, но bigint
, поскольку, он «расширен счетчиком« эпохи », поэтому он не будет меняться в течение срока службы установки» (цитируя руководство ).
Если обход транзакций еще не произошел, оба значения, кажется, совпадают:
# CREATE TABLE test (label text);
CREATE TABLE
# INSERT INTO test VALUES ('test') RETURNING txid_current();
txid_current
--------------
674500
(1 row)
INSERT 0 1
# SELECT xmin FROM test;
xmin
--------
674500
(1 row)
Но мне интересно: эти два значения всегда сопоставимы? Насколько я понимаю, txid_current()
будет продолжать доставлять уникальные значения после обхода идентификатора транзакции (не более 2 ^ 32 транзакций) и xmin
будет начинаться с нуля. Это означает, что оба начинают возвращать разные значения в этой точке?
И если это так, то есть ли способ извлечь регулярные xid
из txid_current()
результата , так что он будет соответствовать xmin
записям в таблице (например , литье txid_current()
в целое число)?
Изменить : прояснить, что я забочусь о том, что происходит после обхода идентификатора транзакции, что, скорее всего, происходит задолго до 2 ^ 32 транзакций. Спасибо Даниэлю Верите за то, что отметили это в комментариях.
VACUUM FREEZE
перезаписыватьxmin
строки строк задолго до перехода на 2 ^ 32. Проверьте Freezing Your Tuples Off для обзора предмета.xmin
становится замороженным, вопрос все еще остается в том, как более новое (обычное)xmin
сравнение с тогда исполняемымtxid_current()
.Ответы:
Вы можете удалить добавленную эпоху, чтобы она соответствовала значению
xmin
, то есть извлечь 4-байтinteger
изbigint
. Посколькуxmin
это тип,xid
а не (подписано!)integer
, Мы сравниваемtext
представление:Детальное объяснение:
источник