Окрім своїх звичайних стовпців, у таблицях 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 транзакцій. Дякую Даніелю Верите, який зазначив це у коментарях.
xmin
заморожуються, все ще стоїть питання про те, наскільки новіші (регулярні) xmin
порівнянні з тодішніми страченими txid_current()
.
VACUUM FREEZE
перезаписуватиxmin
рядки задовго до обертання 2 ^ 32. Ознайомтесь із заморожуванням кортежів для ознайомлення з цим питанням.