Як порівняти xmin та txid_current () після завершення ідентифікатора транзакцій?


12

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


1
Ви ігноруєте той факт, що система буде VACUUM FREEZEперезаписувати xminрядки задовго до обертання 2 ^ 32. Ознайомтесь із заморожуванням кортежів для ознайомлення з цим питанням.
Даніель Веріте

Щоправда, я залишив цей факт поза сумнівом, дякую, що вказав на нього. І дійсно замерзання відбудеться задовго до 2 ^ 32. Однак, навіть коли старі xminзаморожуються, все ще стоїть питання про те, наскільки новіші (регулярні) xminпорівнянні з тодішніми страченими txid_current().
tomka

1
Варто зазначити, що PostgreSQL вимкнеться, якщо до завершення роботи залишиться менше 1 мільйона транзакцій .
користувач103153

Відповіді:


6

Ви можете зняти додану епоху, щоб вона відповідала значенню xmin, тобто витягнути 4-байт integerз bigint. Оскільки xminце тип, xidа не (підписано!) integer, Ми порівняємо textпредставлення:

SELECT * FROM test
WHERE  xmin::text = (txid_current() % (2^32)::bigint)::text;

Детальне пояснення:

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.