PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Come interpretare il valore txid_current() di PosgreSQL

Punti chiave da capire:

  • Tutto è in una transazione. Se non ne crei uno esplicitamente con BEGIN e COMMIT (o ROLLBACK ) ne viene creato uno solo per quella dichiarazione.

  • Sola lettura SELECT s non ottengono un ID transazione completo, ottengono solo un ID transazione virtuale. Quindi, anche se è una transazione, SELECT 1; o qualsiasi altra cosa non incrementi il ​​contatore dell'ID transazione.

  • Chiamando txid_current() forze l'assegnazione di un ID transazione se non ne era già stato assegnato uno. Quindi una transazione di sola lettura ora avrà un ID transazione, dove prima non lo avrebbe fatto.

Naturalmente, anche i txid vengono allocati tra le sessioni. In pratica il tuo esempio sopra potrebbe ottenere txid di a+1 e a+429 se il database è occupato.

In genere non è saggio utilizzare l'ID transazione per qualsiasi cosa a livello di applicazione. In particolare:

Tratta xmin e xmax come campi interni a livello di sistema e tratta il risultato di txid_current() come un valore numerico privo di significato.

Dettagli sugli usi corretti e non corretti per xids

In particolare non dovresti mai:

  • Confronta xid per valore numerico per trarre qualsiasi tipo di conclusione sul loro ordinamento;
  • Aggiungere o sottrarre ID transazione;
  • Ordina gli ID transazione;
  • Incrementa o decrementa gli ID transazione
  • Confronta un xid a 32 bit campo digitato con un bigint a 64 bit epoch-exid xid, anche per l'uguaglianza.

Quindi dal punto di vista dell'applicazione gli xids non sono né monotoni né ordinali.

puoi in sicurezza:

  • confronta due xid con estensione epoca a 64 bit per uguaglianza o disuguaglianza; e
  • passa xids a txid_status(...) e altre funzioni documentate come xid

Attenzione:PostgreSQL utilizza xid stretti a 32 bit come xid type e xids estesi in epoche a 64 bit generalmente rappresentati come bigint come quelli restituiti da txid_current() . Il confronto di questi per l'uguaglianza sembrerà generalmente funzionare su una nuova installazione del database, ma una volta che si è verificato il primo giro di epoca e non saranno più uguali. Pg non ti dà nemmeno un modo semplice per vedere l'epoca xid a livello SQL; devi:

select (txid_current() >> 32) AS xid_epoch;

per ottenere i 32 bit superiori dell'xid esteso in epoche riportato da txid_current() .

Quindi... qualunque cosa tu stia cercando di fare, è probabile che l'ID transazione non sia il modo giusto per farlo.