Oracle
 sql >> Database >  >> RDS >> Oracle

I commit espliciti vanno bene quando l'autocommit è attivo?

Commettere all'interno di un ciclo è generalmente una cattiva idea (così come consentire a qualsiasi strumento di eseguire automaticamente il commit).

Impegnarsi all'interno di un ciclo rende molto più difficile scrivere codice riavviabile. Cosa succede se si verifica un errore dopo 3 iterazioni? Ora hai eseguito correttamente il commit dei risultati di 2 UPDATE dichiarazioni. Presumibilmente, dovresti quindi capire quali righe sono state aggiornate e scrivere codice per annullare gli aggiornamenti oppure dovresti aggiungere codice che eviti di tentare di aggiornare i dati per quei due yearid riusciti. i valori. Questo è certamente possibile. Ma implica la scrittura di un mucchio di codice per tenere traccia dei tuoi progressi e generalmente rende il tuo codice molto più complesso.

Impegnarsi all'interno di un ciclo rende il codice molto più lento. Commettere è generalmente un'operazione piuttosto costosa. Farlo in un ciclo, quindi, è generalmente una cattiva idea. È meno problematico se hai solo poche dozzine di iterazioni di loop. Ma se hai centinaia o migliaia di iterazioni, puoi facilmente finire per passare la maggior parte del tuo tempo a impegnarti.

L'impegno all'interno di un ciclo aumenta sostanzialmente il rischio di causare un errore ORA-01555. La tua domanda su MyTable necessita di una visualizzazione coerente in lettura dei dati. Se esegui il commit all'interno del ciclo, tuttavia, stai dicendo a Oracle che la tua sessione non ha più bisogno di UNDO precedenti dati. Se Oracle elimina UNDO dati di cui hai bisogno per una successiva iterazione del ciclo, riceverai un errore. E poi torni a occuparti di codice non riavviabile in cui hai superato con successo N iterazioni ma non sai quali anni sono stati elaborati o quali devono essere elaborati.

Impegnarsi all'interno di un ciclo può creare problemi di coerenza dei dati. Se un'altra sessione sta eseguendo rapporti, ad esempio, è facile che tali rapporti visualizzino dati parzialmente aggiornati, il che spesso significa che i dati saranno incoerenti. Se i dati per 3 anni sono cambiati ma altri anni no, può essere molto difficile dare un senso ai rapporti e le persone (o processi) possono facilmente prendere decisioni sbagliate.

Impegnarsi all'interno di un ciclo rende anche il codice meno riutilizzabile. Se il tuo codice include commit (o rollback diversi da un punto di salvataggio che hai stabilito all'interno del blocco), non può essere chiamato da nessun altro pezzo di codice che non vuole che la sua transazione sia ancora impegnata. Ciò porta le persone a provare a re-implementare la tua logica senza il controllo delle transazioni o a violare erroneamente l'integrità transazionale che inevitabilmente le porta a creare applicazioni che introducono problemi di coerenza dei dati.