Além de suas colunas regulares, as tabelas do Postgres também têm várias colunas do sistema disponíveis. Um deles xmin
,, armazena o ID da transação usada para criar uma linha. Seu tipo de dado é xid
um número inteiro de quatro bytes que envolve 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 ", não envolve a vida útil da instalação" (para citar o manual ).
Se as transações abrangentes ainda não ocorreram, 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? Tanto quanto eu entendo, txid_current()
continuará a fornecer valores exclusivos após a identificação 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 xid
um txid_current()
resultado regular para que ele corresponda às xmin
entradas de uma tabela (por exemplo, conversão txid_current()
para inteiro)?
Editar : deixe mais claro que eu me importo com o que acontece após a identificação de uma transação, o que provavelmente acontece muito antes de 2 ^ 32 transações. Agradecemos a Daniel Vérité por observar isso nos comentários.
xmin
o congelamento dos antigos, a questão ainda permanece: como os mais recentes (regulares) se xmin
comparam aos que foram executados txid_current()
.
VACUUM FREEZE
substituirá asxmin
linhas muito antes da envolvente 2 ^ 32. Confira Congelando suas tuplas desativadas para uma visão geral do assunto.