Oltre alle sue colonne regolari, le tabelle di Postgres hanno anche diverse colonne di sistema disponibili. Uno di questi, xmin
memorizza l'ID transazione utilizzato per creare una riga. Il suo tipo di dati è xid
, un numero intero di quattro byte che si avvolge in qualche punto (cioè non necessariamente univoco). La funzione txid_current()
a sua volta restituisce l'ID transazione corrente, ma come bigint
, perché "è esteso con un contatore" epoca "in modo che non si avvolga durante la vita di un'installazione" (per citare il manuale ).
Se le transazioni avvolgenti non sono ancora avvenute, entrambi i valori sembrano corrispondere:
# 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)
Ma mi chiedo: questi due valori sono sempre comparabili? A quanto ho capito, txid_current()
continuerà a fornire valori univoci dopo il wraparound dell'ID transazione (al massimo 2 ^ 32 transazioni) e xmin
inizierà da zero. Ciò significa che entrambi iniziano a restituire valori diversi a quel punto?
E se questo è vero, c'è un modo per estrarre regolarmente xid
un txid_current()
risultato in modo che corrisponda alle xmin
voci in una tabella (ad es. Casting txid_current()
in numero intero)?
Modifica : chiarisci che mi preoccupo di ciò che accade dopo un avvolgimento dell'ID transazione, che molto probabilmente accade molto prima delle transazioni 2 ^ 32. Grazie a Daniel Vérité per averlo notato nei commenti.
xmin
congelano, la domanda rimane ancora come il più nuovo (normale) xmin
paragonato a un allora eseguito txid_current()
.
VACUUM FREEZE
sovrascriverà lexmin
righe on molto prima del wraparound 2 ^ 32. Dai un'occhiata a Freezing Your Tuples Off per una panoramica sull'argomento.