Come confrontare xmin e txid_current () dopo le transazioni ID wraparound?


12

Oltre alle sue colonne regolari, le tabelle di Postgres hanno anche diverse colonne di sistema disponibili. Uno di questi, xminmemorizza 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 xmininizierà da zero. Ciò significa che entrambi iniziano a restituire valori diversi a quel punto?

E se questo è vero, c'è un modo per estrarre regolarmente xidun txid_current()risultato in modo che corrisponda alle xminvoci 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.


1
Stai ignorando il fatto che il sistema VACUUM FREEZEsovrascriverà le xminrighe on molto prima del wraparound 2 ^ 32. Dai un'occhiata a Freezing Your Tuples Off per una panoramica sull'argomento.
Daniel Vérité,

È vero, ho lasciato questo fatto fuori questione, grazie per averlo indicato. E infatti il ​​congelamento accadrà molto prima di 2 ^ 32. Tuttavia, anche con i vecchi che si xmincongelano, la domanda rimane ancora come il più nuovo (normale) xminparagonato a un allora eseguito txid_current().
tomka,

1
Vale la pena notare che PostgreSQL si chiuderà se restano meno di 1 milione di transazioni fino al termine .
user103153

Risposte:


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.