Ангажирането вътре в цикъл обикновено е лоша идея (както и позволяването на всеки инструмент да се ангажира автоматично).
Ангажирането вътре в цикъл прави много по-трудно писането на рестартируем код. Какво се случва, ако срещнете грешка след 3 итерации? Вече успешно сте записали резултатите от 2 UPDATE
изявления. Вероятно тогава ще трябва или да разберете кои редове са актуализирани и да напишете код, за да обърнете актуализациите, или ще трябва да добавите код, който избягва опитите за актуализиране на данните за тези две успешни yearid
стойности. Това със сигурност е възможно. Но това включва писане на куп код за проследяване на напредъка ви и като цяло прави кода ви много по-сложен.
Ангажирането вътре в цикъл прави кода ви много по-бавен. Обвързването обикновено е доста скъпа операция. Следователно да го правите в цикъл обикновено е лоша идея. Това е по-малък проблем, ако имате само няколко дузини итерации на цикъл. Но ако имате стотици или хиляди повторения, лесно можете да прекарате по-голямата част от времето си в ангажиране.
Комитирането вътре в цикъл значително увеличава риска да предизвикате грешка ORA-01555. Вашата заявка срещу MyTable
се нуждае от последователен изглед на данните. Ако обаче се ангажирате вътре в цикъла, вие казвате на Oracle, че вашата сесия вече не се нуждае от по-стари UNDO
данни. Ако се случи Oracle да изчисти UNDO
данни, които са ви необходими за следваща итерация на цикъла, ще получите грешка. И тогава отново се занимавате с нерестартируем код, при който успешно сте преминали през N итерации, но не знаете кои години са били обработени или кои трябва да бъдат обработени.
Ангажирането вътре в цикъл може да създаде проблеми с последователността на данните. Ако някоя друга сесия изпълнява отчети, например, за тези отчети е лесно да видят частично актуализирани данни, което често означава, че данните ще бъдат непоследователни. Ако данните за 3 години са се променили, но за други години не, може да бъде много трудно да се осмислят отчетите и хората (или процесите) лесно могат да вземат неправилни решения.
Ангажирането вътре в цикъл също прави вашия код по-малко повторно използваем. Ако вашият код включва ангажименти (или връщания назад, различни от точка за запис, която сте установили вътре в блока), той не може да бъде извикан от друга част от кода, която все още не иска неговата транзакция да бъде ангажирана. Това кара хората да се опитват да внедрят отново вашата логика без контрол на транзакциите или да нарушават неправилно целостта на транзакциите, което неизбежно ги кара да създават приложения, които въвеждат проблеми с последователността на данните.