通常の列に加えて、Postgresテーブルにはさまざまなシステム列があります。そのうちの1つはxmin
、行の作成に使用されるトランザクションIDを格納します。そのデータ型はxid
、ある時点で折り返す4バイトの整数です(つまり、必ずしも一意ではありません)。この関数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)
しかし、私は疑問に思う:これらの2つの値は常に同等ですか?私の知る限り、txid_current()
トランザクションIDのラップアラウンド(最大2 ^ 32トランザクション)後も一意の値を配信し続けxmin
、ゼロから開始します。これは、両方がその時点で異なる値を返し始めることを意味しますか?
そして、これが当てはまる場合xid
、txid_current()
結果を規則的に抽出xmin
して、テーブル内のエントリと一致するようにする方法はありますか(たとえばtxid_current()
、整数へのキャスト)。
編集:トランザクションIDのラップアラウンドの後、2 ^ 32トランザクションのかなり前に起こる可能性が非常に高いことを気にかけていることを明確にします。コメントでこれを指摘してくれたDanielVéritéに感謝します。
xmin
が凍結されたとしても、その質問はまだxmin
実行されたものと比較して新しい(通常の)ものであることに変わりありませんtxid_current()
。
VACUUM FREEZE
を上書きするという事実を無視していますxmin
。テーマの概要については、「タプルをオフにする」をご覧ください。