sql >> Databasteknik >  >> RDS >> Oracle

Är explicita commits okej när autocommit är på?

Att begå inuti en loop är generellt sett en dålig idé (så att tillåta alla verktyg att automatiskt begå).

Att begå inuti en loop gör det mycket svårare att skriva omstartbar kod. Vad händer om du stöter på ett fel efter 3 iterationer? Du har nu genomfört resultaten av 2 UPDATE uttalanden. Förmodligen måste du sedan antingen ta reda på vilka rader som uppdaterades och skriva kod för att vända uppdateringarna eller så måste du lägga till kod som undviker att försöka uppdatera data för dessa två framgångsrika yearid värden. Det är säkert möjligt. Men det innebär att du skriver en massa kod för att spåra dina framsteg och gör din kod mycket mer komplex.

Att begå i en loop gör din kod mycket långsammare. Att binda sig är i allmänhet en ganska dyr operation. Att göra det i en slinga är därför generellt sett en dålig idé. Det är mindre problem om du bara har några dussin loopiterationer. Men om du har hundratals eller tusentals iterationer, kan du lätt lägga ner den stora majoriteten av din tid på att engagera dig.

Att begå inuti en loop ökar avsevärt risken att du orsakar ett ORA-01555-fel. Din fråga mot MyTable behöver en konsekvent läsning av data. Om du commit inuti loopen säger du dock till Oracle att din session inte längre behöver äldre UNDO data. Om Oracle råkar rensa UNDO data som du behöver för en efterföljande iteration av slingan, får du ett felmeddelande. Och sedan är du tillbaka och hanterar icke-omstartbar kod där du framgångsrikt har gått igenom N iterationer men du inte vet vilka år som har bearbetats eller vilka som behöver bearbetas.

Att engagera sig i en loop kan skapa datakonsistensproblem. Om någon annan session kör rapporter, till exempel, är det lätt för dessa rapporter att se delvis uppdaterade data, vilket ofta innebär att data blir inkonsekventa. Om uppgifterna för 3 år har förändrats men andra år inte har det, kan det vara mycket svårt att förstå rapporterna och människor (eller processer) kan lätt fatta felaktiga beslut.

Att begå i en loop gör också din kod mindre återanvändbar. Om din kod innehåller commits (eller rollbacks på annat sätt än till en räddningspunkt som du har skapat i blocket), kan den inte anropas av någon annan kod som inte vill att transaktionen ska begås ännu. Det leder till att människor försöker implementera din logik igen utan transaktionskontroll eller att felaktigt kränka transaktionsintegriteten, vilket oundvikligen leder till att de bygger applikationer som introducerar problem med datakonsistens.



  1. inga privilegier på tabellutrymmet 'USERS'

  2. MySQL MATCH fungerar inte med två karaktärer?

  3. extrahera delsträng från mysql-kolumnen med hjälp av regex

  4. Pivotera en tabell i SQL (d.v.s. korstabulering/korstabulering)