PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Defina o valor SERIAL atomicamente ao confirmar a transação


Postgres 9.5 introduziu um novo recurso relacionado a este problema:commit timestamps .

Você só precisa ativar track_commit_timestamp em postgresql.conf (e reinicie!) para começar a rastrear os timestamps de commit. Então você pode consultar:
SELECT * FROM tbl
WHERE  pg_xact_commit_timestamp(xmin) >= '2015-11-26 18:00:00+01';

Leia o capítulo "Commit timestamp tracking" no Postgres Wiki.
Utilitário relacionado funções no manual .

A volatilidade da função é apenas VOLATILE porque os IDs de transação (xid ) pode envolver por definição. Então você não pode criar um índice funcional nele.
Você pode falsificar IMMUTABLE volatilidade em um wrapper de função para aplicativos em um período de tempo limitado, mas você precisa estar ciente das implicações. Caso relacionado com mais explicações:

Para muitos casos de uso (como o seu?) que estão interessados ​​apenas na sequência de commits (e não no tempo absoluto), pode ser mais eficiente trabalhar com xmin transmitir para bigint "diretamente" (xmin::text::bigint ) em vez de carimbos de data/hora de confirmação. (xid é um inteiro sem sinal internamente, a metade superior que não cabe em um integer assinado .) Mais uma vez, esteja ciente das limitações devido ao possível contorno do xid.

Pelo mesmo motivo, os carimbos de data/hora de confirmação não são preservados indefinidamente . Para bancos de dados pequenos e médios, xid o wraparound quase nunca acontece - mas eventualmente acontecerá se o cluster estiver ativo por tempo suficiente. Leia o capítulo "Evitando falhas de wraparound de ID de transação" no manual para detalhes.