Окрім своїх звичайних стовпців, у таблицях 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. Ознайомтесь із заморожуванням кортежів для ознайомлення з цим питанням.