É seguro assumir que a ordenação por um PK de incremento automático no Postgres ordenará os registros cronologicamente, do ponto de vista da criação? Eu tenho um relacionamento de muitos para muitos, do qual não preciso rastrear mais nada, exceto o próprio relacionamento e alguma forma de ordem de criação. Estou tentando decidir se preciso incorporar uma coluna de carimbo de data/hora para isso ou se posso reutilizar a coluna PK de incremento automático existente para a mesma finalidade.
relate perguntas
-
Chaves primárias de caractere x número inteiro
-
Práticas recomendadas para executar a replicação atrasada do deslocamento de tempo
-
Os procedimentos armazenados impedem a injeção de SQL?
-
Sequências Biológicas do UniProt no PostgreSQL
-
Qual é a diferença entre a replicação do PostgreSQL 9.0 e o Slony-I?
Assumindo que "incremento automático" você quer dizer o
SERIAL
pseudo-tipo Postgres , a resposta curta é "nem sempre".SERIAL
as colunas são implementadas usando sequências SQL padrão, que podem gerar valores fora de ordem quando usadas por várias sessões simultâneas se oCACHE
parâmetro for definido como algo maior que 1. O manual afirma o seguinte:Deixar
CACHE
o valor em 1 pode prejudicar o desempenho em um ambiente com alta simultaneidade, então você terá que escolher o que é mais importante para você.Na minha opinião, tentar redirecionar
SERIAL
o rastreamento da ordem de criação de registros não é uma boa ideia, porque potencialmente cria um problema de manutenção: uma vez que a única promessa da sequência é fornecer algum valor de incremento exclusivo para cadanextval
solicitação, contando com seu comportamento sob um circunstância pode fazer com que seu aplicativo se comporte de forma imprevisível quando a situação muda, por exemplo, os detalhes de implementação da sequência são modificados em uma versão futura do Postgres, ou mudanças em sua carga de trabalho exigem que você aumente aCACHE
configuração. Usar um timestamp adequado para ordenação é mais seguro e semanticamente mais claro.O que você entende por ordem cronológica?
Se houver uma transação 1 que começa antes da transação 2, mas termina após a transação 2, a primeira transação é a transação 1 ou a transação 2?
Se você estiver usando o
SERIALIZABLE
nível de isolamento de transações, ele garante que há uma ordem total para as transações: ou seja, há alguma ordem serial (não paralela) para as transações que daria o mesmo resultado das transações em execução no seu real sistema paralelo de vida.Muito provavelmente, as sequências do PostgreSQL não fornecerão exatamente a mesma ordenação de valores do que a ordem total serializável. Você pode corrigir isso criando sua própria sequência: crie uma tabela com uma linha com uma coluna inteira e atualize essa linha. No entanto, se fizer isso, a paralelização de suas transações será prejudicada. Ele pode até sofrer de uma maneira que faz com que algumas das transações falhem.
Uma solução, conforme proposto por um comentário, são os carimbos de data/hora. No entanto, a ordem do carimbo de data/hora não é necessariamente a mesma que a ordem serial que daria os mesmos resultados.
(Como uma observação lateral, você deve estar preparado para transações com falha em todos os casos. Deadlocks causam transações com falha. O
SERIALIZABLE
nível de isolamento causa ainda mais transações com falha. A maneira correta é ter back-off exponencial e tentar novamente.)