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

Imposta atomicamente il valore SERIAL durante il commit della transazione

Postgres 9,5 ha introdotto una nuova funzionalità correlata a questo problema:commit timestamp .

Devi solo attivare track_commit_timestamp in postgresql.conf (e riavvia!) per iniziare a tenere traccia dei timestamp di commit. Quindi puoi interrogare:

SELECT * FROM tbl
WHERE  pg_xact_commit_timestamp(xmin) >= '2015-11-26 18:00:00+01';

Leggi il capitolo "Commit timestamp tracking" nel Wiki di Postgres.
Utility utility funzioni nel manuale .

La volatilità della funzione è solo VOLATILE perché gli ID transazione (xid ) può avvolgere per definizione. Quindi non puoi creare un indice funzionale su di esso.
Potresti falsificare IMMUTABLE volatilità in un wrapper di funzioni per applicazioni in un intervallo di tempo limitato, ma è necessario essere consapevoli delle implicazioni. Caso correlato con ulteriori spiegazioni:

Per molti casi d'uso (come il tuo?) che sono interessati solo alla sequenza dei commit (e non al tempo assoluto) potrebbe essere più efficiente lavorare con xmin trasmettere a bigint "direttamente" (xmin::text::bigint ) invece dei timestamp del commit. (xid è un intero senza segno internamente, la metà superiore che non rientra in un integer con segno .) Ancora una volta, tieni presente le limitazioni dovute al possibile avvolgimento di xid.

Per lo stesso motivo, i timestamp di commit non vengono conservati a tempo indeterminato . Per database di piccole e medie dimensioni, xid l'avvolgimento non si verifica quasi mai, ma alla fine succederà se il cluster è attivo abbastanza a lungo. Leggi il capitolo "Prevenzione degli errori di wrapping dell'ID transazione" nel manuale per i dettagli.