Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Os commits explícitos estão corretos quando o autocommit está ativado?


Fazer commit dentro de um loop é geralmente uma má ideia (assim como permitir que qualquer ferramenta faça commit automaticamente).

O commit dentro de um loop torna muito mais difícil escrever código reiniciável. O que acontece se você encontrar um erro após 3 iterações? Você confirmou com sucesso os resultados de 2 UPDATE declarações. Presumivelmente, você precisaria descobrir quais linhas foram atualizadas e escrever código para reverter as atualizações ou teria que adicionar um código que evite tentar atualizar os dados para esses dois yearid bem-sucedidos valores. Isso é certamente possível. Mas envolve escrever um monte de código para rastrear seu progresso e geralmente torna seu código muito mais complexo.

O commit dentro de um loop torna seu código muito mais lento. Committing é geralmente uma operação bastante cara. Fazer isso em um loop, portanto, geralmente é uma má ideia. É menos problemático se você tiver apenas algumas dúzias de iterações de loop. Mas se você tiver centenas ou milhares de iterações, pode facilmente acabar gastando a maior parte do seu tempo se comprometendo.

A confirmação dentro de um loop aumenta substancialmente o risco de você causar um erro ORA-01555. Sua consulta em MyTable precisa de uma visão consistente de leitura dos dados. Se você confirmar dentro do loop, no entanto, estará dizendo ao Oracle que sua sessão não precisa mais de UNDO mais antigo dados. Se a Oracle limpar UNDO dados necessários para uma iteração subsequente do loop, você receberá um erro. E então você está de volta lidando com código não reiniciável onde você passou com sucesso por N iterações, mas você não sabe quais anos foram processados ​​ou quais precisam ser processados.

A confirmação dentro de um loop pode criar problemas de consistência de dados. Se alguma outra sessão estiver executando relatórios, por exemplo, é fácil para esses relatórios verem dados parcialmente atualizados, o que geralmente significa que os dados serão inconsistentes. Se os dados de 3 anos mudaram, mas outros anos não, pode ser muito difícil entender os relatórios e as pessoas (ou processos) podem facilmente tomar decisões incorretas.

O commit dentro de um loop também torna seu código menos reutilizável. Se o seu código inclui commits (ou rollbacks que não sejam para um savepoint que você estabeleceu dentro do bloco), ele não pode ser chamado por qualquer outro pedaço de código que não queira que sua transação seja confirmada ainda. Isso leva as pessoas a tentar reimplementar sua lógica sem o controle de transações ou violar incorretamente a integridade transacional, o que inevitavelmente os leva a criar aplicativos que introduzem problemas de consistência de dados.