Além de suas colunas regulares, as tabelas do Postgres também possuem várias colunas de sistema disponíveis. Um deles, xmin
, armazena o ID da transação usado para criar uma linha. Seu tipo de dados é xid
, um inteiro de quatro bytes que envolve em algum ponto (ou seja, não necessariamente único). A função txid_current()
, por sua vez, retorna o ID da transação atual, mas como bigint
, porque "é estendido com um contador de 'época' para que não seja interrompido durante a vida útil de uma instalação" (para citar o manual ).
Se o wraparound das transações ainda não ocorreu, ambos os valores parecem corresponder:
# 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)
Mas eu me pergunto: esses dois valores são sempre comparáveis? Pelo que entendi, txid_current()
continuará a fornecer valores exclusivos após a conclusão do ID da transação (no máximo 2 ^ 32 transações) e xmin
começará do zero. Isso significa que ambos começam a retornar valores diferentes nesse ponto?
E se isso for verdade, existe uma maneira de extrair regular xid
de um txid_current()
resultado para que corresponda às xmin
entradas em uma tabela (por exemplo, conversão txid_current()
para número inteiro)?
Editar : Deixe claro que me preocupo com o que acontece após um wraparound de ID de transação, o que provavelmente acontece muito antes de 2 ^ 32 transações. Obrigado a Daniel Vérité por notar isso nos comentários.
Você pode remover a época adicionada para corresponder ao valor em
xmin
, ou seja, extrair os 4 bytesinteger
do arquivobigint
. Comoxmin
é tipoxid
e não (assinado!)integer
, comparamos atext
representação:Explicação detalhada: