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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top