Oprócz zwykłych kolumn w tabelach Postgres dostępne są również różne kolumny systemowe . Jeden z nich xmin
przechowuje identyfikator transakcji użyty do utworzenia wiersza. Jego typ danych to xid
czterobajtowa liczba całkowita, która w pewnym momencie się zawija (tzn. Niekoniecznie jest unikalna). Ta funkcja txid_current()
z kolei zwraca bieżący identyfikator transakcji, ale ponieważ bigint
, ponieważ „jest on rozszerzony o licznik„ epoki ”, więc nie zawinie się podczas instalacji” (cytując instrukcję ).
Jeśli obejście transakcji jeszcze się nie wydarzyło, obie wartości wydają się pasować:
# 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)
Ale zastanawiam się: czy te dwie wartości są zawsze porównywalne? O ile rozumiem, txid_current()
nadal będzie dostarczał unikalne wartości po zawinięciu identyfikatora transakcji (maksymalnie 2 ^ 32 transakcje) i xmin
zacznie od zera. Oznacza to, że oba zaczynają zwracać różne wartości w tym momencie?
I czy to prawda, czy jest jakiś sposób, aby wyodrębnić regularny xid
z txid_current()
wyniku, tak by pasować xmin
wpisy w tabeli (np odlewniczej txid_current()
do liczby całkowitej)?
Edycja : Wyjaśnij, że zależy mi na tym, co stanie się po zawinięciu identyfikatora transakcji, co najprawdopodobniej nastąpi na długo przed 2 ^ 32 transakcjami. Dzięki Danielowi Vérité za odnotowanie tego w komentarzach.
VACUUM FREEZE
nadpiszexmin
wiersze w wierszu na długo przed zawinięciem 2 ^ 32. Sprawdź Freezing Your Tuples Off, aby zapoznać się z omówieniem tego tematu.xmin
zamrożeniu starego pytania wciąż pozostaje pytanie, jak nowszy (zwykły) wxmin
porównaniu z wykonanym wówczastxid_current()
.Odpowiedzi:
Możesz usunąć dodaną epokę, aby dopasować ją do wartości
xmin
, tj. Wyodrębnić 4 bajtyinteger
zbigint
. Ponieważxmin
jest typem,xid
a nie (podpisanym!)integer
,text
Zamiast tego porównujemy reprezentację:Szczegółowe wyjaśnienie:
źródło