In Postgres-Tabellen stehen neben den regulären Spalten auch verschiedene Systemspalten zur Verfügung. Einer von ihnen xmin
speichert die Transaktions-ID, die zum Erstellen einer Zeile verwendet wurde. Sein Datentyp ist xid
eine 4-Byte-Ganzzahl, die sich irgendwann umgibt (dh nicht unbedingt eindeutig ist). Die Funktion gibt txid_current()
ihrerseits die aktuelle Transaktions-ID zurück, jedoch als bigint
, weil sie "um einen" Epochen "-Zähler erweitert ist, so dass sie sich während der Lebensdauer einer Installation nicht umhüllt" (um das Handbuch zu zitieren ).
Wenn der Transaktionsumlauf noch nicht stattgefunden hat, stimmen anscheinend beide Werte überein:
# 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)
Aber ich frage mich: Sind diese beiden Werte immer vergleichbar? Soweit ich weiß, txid_current()
werden nach dem Umlauf der Transaktions-ID (höchstens 2 ^ 32 Transaktionen) weiterhin eindeutige Werte geliefert und xmin
bei Null begonnen. Dies bedeutet, dass beide zu diesem Zeitpunkt unterschiedliche Werte zurückgeben.
Und wenn dies zutrifft, gibt es eine Möglichkeit, xid
ein txid_current()
Ergebnis so zu extrahieren , dass es mit xmin
Einträgen in einer Tabelle übereinstimmt (z. B. Umwandlung txid_current()
in eine Ganzzahl)?
Bearbeiten : Machen Sie klarer, dass es mir wichtig ist, was nach einem Transaktions-ID-Wraparound passiert, was sehr wahrscheinlich lange vor 2 ^ 32 Transaktionen passiert. Vielen Dank an Daniel Vérité, der dies in den Kommentaren vermerkt hat.
VACUUM FREEZE
diexmin
on-Zeilen lange vor dem 2 ^ 32-Wraparound überschreibt . Schauen Sie sich Freezing Your Tuples Off an, um einen Überblick zu diesem Thema zu erhalten.xmin
eingefrorenem Altem stellt sich die Frage, wie neuere (reguläre) imxmin
Vergleich zu einem dann ausgeführtentxid_current()
.Antworten:
Sie können die hinzugefügte Epoche entfernen, um sie dem Wert in
xmin
anzupassen, dh das 4-Byteinteger
aus der extrahierenbigint
. Daxmin
es sich um Typxid
und nicht (signiert!)integer
Handelt, vergleichen wirtext
stattdessen die Darstellung:Ausführliche Erklärung:
quelle