Postgresql
如何在事務 ID 環繞後比較 xmin 和 txid_current()?
除了正常列之外,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
並將從零開始。這意味著兩者都開始返回不同的值嗎?如果這是真的,有沒有辦法提取結果的規則
xid
,txid_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;
詳細解釋: