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

Como interpretar o valor txid_current() do PosgreSQL


Pontos-chave para entender:

  • Tudo está em uma transação. Se você não criar um explicitamente com BEGIN e COMMIT (ou ROLLBACK ) um é criado para você apenas para essa declaração.

  • SELECT somente leitura s não recebem um ID de transação completo, eles apenas obtêm um ID de transação virtual. Portanto, mesmo que seja uma transação, SELECT 1; ou o que não incrementa o contador de ID de transação.

  • Chamando txid_current() forças a alocação de um ID de transação, caso ainda não tenha sido alocado. Portanto, uma transação somente leitura agora terá um ID de transação, onde anteriormente não teria.

Obviamente, os txids também são alocados entre as sessões. Na prática, seu exemplo acima pode obter txid de a+1 e a+429 se o banco de dados estiver ocupado.

Geralmente, não é aconselhável usar o ID da transação para qualquer coisa no nível do aplicativo. Em particular:

Tratar xmin e xmax como campos de nível de sistema interno e tratam o resultado de txid_current() como um valor numérico sem sentido.

Detalhes sobre usos corretos e incorretos para xids


Em particular, você nunca deve:
  • Compare xids por valor numérico para tirar qualquer tipo de conclusão sobre sua ordenação;
  • Adicionar ou subtrair IDs de transação;
  • Classificar IDs de transação;
  • Incrementar ou diminuir IDs de transação
  • Compare um xid de 32 bits campo digitado com um bigint de 64 bits xid estendido por época, mesmo para igualdade.

Portanto, do ponto de vista do aplicativo, os xids não são monótonos nem ordinais.

Você pode com segurança:
  • compare dois xids estendidos por época de 64 bits para igualdade ou desigualdade; e
  • passar xids para txid_status(...) e outras funções documentadas como tendo um xid

Cuidado:o PostgreSQL usa xids estreitos de 32 bits como o xid type e xids estendidos por época de 64 bits normalmente representados como bigint como aqueles retornados por txid_current() . Compará-los para igualdade geralmente parece funcionar em uma nova instalação de banco de dados, mas uma vez que o primeiro contorno de época tenha ocorrido, eles não serão mais iguais. A Pg nem mesmo oferece uma maneira fácil de ver a época xid no nível SQL; Voce tem que:
select (txid_current() >> 32) AS xid_epoch;

para obter os 32 bits superiores do xid estendido por época relatado por txid_current() .

Então... o que quer que você esteja tentando fazer, é provável que o ID da transação não seja a maneira correta de fazê-lo.