O que o Postgres faz quando o início é executado em uma conexão no modo autocomit?
-
21-09-2019 - |
Pergunta
Estou tentando entender melhor o conceito de 'AutoComit' ao trabalhar com uma conexão Postgres (PsycopG). Digamos que eu tenho uma nova conexão, defina seu nível de isolamento como isolation_level_autocomit e depois execute esse SQL diretamente, sem usar os métodos de início/reversão do cursor (como um exercício; não estou dizendo que eu realmente quero fazer isso):
INSERT A
INSERT B
BEGIN
INSERT C
INSERT D
ROLLBACK
O que acontece para inserir C&D?
O AutoCommit é puramente um cenário interno no PsycopG que afeta o início do problema? Nesse caso, o SQL acima não é afetado; As inserções A&B são comprometidas assim que estão concluídas, enquanto C&D são executadas em uma transação e revertidas. Em que nível de isolamento essa transação é executada?
Ou é autocomit uma configuração real na própria conexão? Nesse caso, como isso afeta o manuseio do início? É ignorado ou substitui a configuração autocomit para realmente iniciar uma transação? Em que nível de isolamento essa transação é executada?
Ou estou completamente fora do alvo?
Solução
Modo Autocomit significa que cada instrução começa implicitamente e termina a transação.
No seu caso, se o AutoCommit estiver desligado:
- O cliente iniciará implicitamente a transação para a primeira declaração
- o
BEGIN
emitirá um aviso dizendo que a transação já foi iniciada - o
ROLLBACK
Vai reverter todas as quatro declarações
Quando o AutoCommit está ligado, apenas o c
e d
são revertidos.
Observe que PostgreSQL
não tem interno AUTOCOMMIT
comportamento desde então 8.0
: Todos os recursos autocomit são confiados nos clientes.
Outras dicas
Por padrão, o PostgreSQL tem autocomit, o que significa que cada instrução é tratada como uma transação. Se você disser explicitamente para iniciar uma transação, como no seu exemplo, esses itens estão em uma nova transação.
No seu exemplo, A e B seriam comprometidos, C e D seriam revertidos.
Quando o AutoCommit está no PsycopG, apenas envia tudo para o back -end do PostGresql sem tentar gerenciar a transação para você. Se você não usar o BEGIN/CONMITAR/ROLLBACK, todas as chamadas .Execute () serão imediatamente executadas e comprometidas. Você pode fazer seu próprio gerenciamento de transações emitindo comandos iniciantes/comprometimentos/reversão. Obviamente, no modo autocomit, você não pode chamar Conn.Commit () ou Conn.Rollback () porque PsycopG não está acompanhando as transações, mas apenas enviando qualquer coisa que você .Execute () direto para o back -end.
No seu exemplo A e B, seriam comprometidos, C e D seriam revertidos.