O Postgres aborta transações atuais em caso de erro? Em qualquer caso, você pode fornecer uma referência?
Pesquisar no Google "site:postgres.org transaction abort rollback error" não produziu resultados, e o GPT tem alucinações.
Encontrei essa afirmação no StackOverflow, mas ela não é apoiada por nada.
O Postgres aborta automaticamente as transações sempre que qualquer instrução SQL termina com um erro
Também encontrei isto . É semelhante, mas diferente, pois não lanço exceções (além disso, esse "normalmente" o torna confuso).
A opção level especifica a gravidade do erro. Os níveis permitidos são DEBUG, LOG, INFO, NOTICE, WARNING e EXCEPTION, com EXCEPTION sendo o padrão. EXCEPTION gera um erro (que normalmente aborta a transação atual ); os outros níveis geram apenas mensagens de diferentes níveis de prioridade. Se mensagens de uma prioridade específica são reportadas ao cliente, gravadas no log do servidor ou ambas, é controlado pelas variáveis de configuração log_min_messages e client_min_messages. Veja o Capítulo 19 para mais informações.
Você pode confiar mais em um experimento do que na documentação, principalmente se a documentação não lhe der a declaração clara que você está procurando.
Inicie uma sessão, inicie uma transação, pegue um cadeado:
Agora inicie uma segunda sessão e tente uma operação conflitante que bloqueará o bloqueio:
Agora retorne para a primeira sessão e cause um erro:
Você verá que a segunda sessão agora pode prosseguir, porque o bloqueio foi removido. Como os bloqueios são mantidos até o fim da transação, isso significa que a transação foi removida. Se precisar de confirmação, execute uma instrução válida na segunda sessão e observe a mensagem de erro:
Além disso, olhar
pg_stat_activity
para mostrará a sessão em umstate
formato deidle in transaction (aborted)
.Você precisa de mais alguma confirmação além dessa?
A documentação é realmente leve em detalhes, embora você possa encontrá-la onde as transações são discutidas :
(ênfase minha). O termo destacado é saliente; você pode encontrar mais alguns detalhes no arquivo README descrevendo a interface de processamento de transações .
Em outras palavras, se o mecanismo encontrar um erro ao executar uma transação, ele coloca a transação neste estado especial "abortado", onde ignora qualquer comando após aquele que causou o erro, e cabe à entidade que inicia a transação emitir um
COMMIT
(geralmente uma má ideia) ou umROLLBACK
comando.Mas é de um documento desatualizado. Quaisquer referências ao documento atual do Postgres ainda são muito bem-vindas.