Postgresql

如何在事務 ID 環繞後比較 xmin 和 txid_current()?

  • September 7, 2016

除了正常列之外,Postgres 表還有各種可用的系統列。其中之一xmin,儲存用於創建行的事務 ID。它的數據類型是xid一個四字節整數,在某個點環繞(即不一定是唯一的)。該函式txid_current()反過來返回目前的事務 ID,但是作為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()將在事務 ID 環繞後(最多 2^32 個事務)繼續提供唯一值,xmin並將從零開始。這意味著兩者都開始返回不同的值嗎?

如果這是真的,有沒有辦法提取結果的規則xidtxid_current()以便它匹配xmin表中的條目(例如轉換txid_current()為整數)?

編輯:更清楚地表明我關心事務 ID 環繞之後會發生什麼,這很可能發生在 2^32 個事務之前很久。感謝 Daniel Vérité 在評論中指出這一點。

您可以剝離添加的紀元以匹配 中的值,即從 中xmin提取 4 字節。由於is type而不是 (signed!) ,我們改為比較表示:integer``bigint``xmin``xid``integer``text

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

詳細解釋:

引用自:https://dba.stackexchange.com/questions/146315