At forpligte sig inde i en løkke er generelt en dårlig idé (det samme er at tillade ethvert værktøj til automatisk at forpligte sig).
At begå inde i en loop gør det meget sværere at skrive genstartbar kode. Hvad sker der, hvis du støder på en fejl efter 3 gentagelser? Du har nu begået resultaterne af 2 UPDATE
udsagn. Formentlig skal du derefter enten finde ud af, hvilke rækker der blev opdateret og skrive kode for at vende opdateringerne, eller du skal tilføje kode, der undgår at forsøge at opdatere dataene for disse to succesfulde yearid
værdier. Det er bestemt muligt. Men det involverer at skrive en masse kode for at spore dine fremskridt og gør generelt din kode meget mere kompleks.
At begå inde i en loop gør din kode meget langsommere. Forpligtelse er generelt en temmelig dyr operation. At gøre det i en løkke er derfor generelt en dårlig idé. Det er mindre af et problem, hvis du kun har et par dusin loop-iterationer. Men hvis du har hundredvis eller tusindvis af iterationer, kan du nemt ende med at bruge langt størstedelen af din tid på at forpligte dig.
Forpligtelse inde i en loop øger markant risikoen for, at du forårsager en ORA-01555-fejl. Din forespørgsel mod MyTable
har brug for en læst konsistent visning af dataene. Hvis du forpligter dig inde i løkken, fortæller du imidlertid Oracle, at din session ikke længere behøver ældre UNDO
data. Hvis Oracle tilfældigvis renser UNDO
data, som du har brug for til en efterfølgende iteration af løkken, får du en fejl. Og så er du tilbage og beskæftiger dig med ikke-genstartbar kode, hvor du med succes har gennemgået N iterationer, men du ikke ved, hvilke år der er blevet behandlet, eller hvilke der skal behandles.
Forpligtelse inde i en loop kan skabe problemer med datakonsistens. Hvis en anden session for eksempel kører rapporter, er det nemt for disse rapporter at se delvist opdaterede data, hvilket ofte vil betyde, at dataene vil være inkonsistente. Hvis data for 3 år har ændret sig, men andre år ikke har ændret sig, kan det være meget svært at forstå rapporterne, og personer (eller processer) kan nemt træffe forkerte beslutninger.
At begå inde i en loop gør også din kode mindre genbrugelig. Hvis din kode indeholder commits (eller rollbacks andet end til et savepoint, du har etableret inde i blokken), kan den ikke kaldes af noget andet kodestykke, der ikke ønsker, at dens transaktion er begået endnu. Det får folk til at forsøge at genimplementere din logik uden transaktionskontrol eller fejlagtigt at krænke transaktionsintegritet, hvilket uundgåeligt får dem til at bygge applikationer, der introducerer datakonsistensproblemer.