Oracle
 sql >> база данни >  >> RDS >> Oracle

Добре ли са изричните ангажименти, когато е включено автоматичното ангажиране?

Ангажирането вътре в цикъл обикновено е лоша идея (както и позволяването на всеки инструмент да се ангажира автоматично).

Ангажирането вътре в цикъл прави много по-трудно писането на рестартируем код. Какво се случва, ако срещнете грешка след 3 итерации? Вече успешно сте записали резултатите от 2 UPDATE изявления. Вероятно тогава ще трябва или да разберете кои редове са актуализирани и да напишете код, за да обърнете актуализациите, или ще трябва да добавите код, който избягва опитите за актуализиране на данните за тези две успешни yearid стойности. Това със сигурност е възможно. Но това включва писане на куп код за проследяване на напредъка ви и като цяло прави кода ви много по-сложен.

Ангажирането вътре в цикъл прави кода ви много по-бавен. Обвързването обикновено е доста скъпа операция. Следователно да го правите в цикъл обикновено е лоша идея. Това е по-малък проблем, ако имате само няколко дузини итерации на цикъл. Но ако имате стотици или хиляди повторения, лесно можете да прекарате по-голямата част от времето си в ангажиране.

Комитирането вътре в цикъл значително увеличава риска да предизвикате грешка ORA-01555. Вашата заявка срещу MyTable се нуждае от последователен изглед на данните. Ако обаче се ангажирате вътре в цикъла, вие казвате на Oracle, че вашата сесия вече не се нуждае от по-стари UNDO данни. Ако се случи Oracle да изчисти UNDO данни, които са ви необходими за следваща итерация на цикъла, ще получите грешка. И тогава отново се занимавате с нерестартируем код, при който успешно сте преминали през N итерации, но не знаете кои години са били обработени или кои трябва да бъдат обработени.

Ангажирането вътре в цикъл може да създаде проблеми с последователността на данните. Ако някоя друга сесия изпълнява отчети, например, за тези отчети е лесно да видят частично актуализирани данни, което често означава, че данните ще бъдат непоследователни. Ако данните за 3 години са се променили, но за други години не, може да бъде много трудно да се осмислят отчетите и хората (или процесите) лесно могат да вземат неправилни решения.

Ангажирането вътре в цикъл също прави вашия код по-малко повторно използваем. Ако вашият код включва ангажименти (или връщания назад, различни от точка за запис, която сте установили вътре в блока), той не може да бъде извикан от друга част от кода, която все още не иска неговата транзакция да бъде ангажирана. Това кара хората да се опитват да внедрят отново вашата логика без контрол на транзакциите или да нарушават неправилно целостта на транзакциите, което неизбежно ги кара да създават приложения, които въвеждат проблеми с последователността на данните.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Създайте таблица DDL с Изпълнете незабавно в базата данни на Oracle, част 2

  2. Oracle Преобразува секунди в часове:минути:секунди

  3. Грешка по време на изпълнение:-2147217887(80040e21) Системата не може да намери текст на съобщение за номер на съобщение 0x80040e21 във файла със съобщения за OraOLEDB

  4. Как да създадете празна/празна колона с SELECT заявка в oracle?

  5. Oracle Закръгляване надолу