Vad är effekten av att placera commit så här i programmet?
Oracle-dokumentationen beskriver COMMIT
som:
Syfte
Använd
COMMIT
uttalande för att avsluta din nuvarande transaktion och göra alla ändringar som görs i transaktionen permanenta. En transaktion är en följd av SQL-satser som Oracle Database behandlar som en enda enhet. Detta uttalande raderar också alla sparpunkter i transaktionen och frigör transaktionslås.
Om du har tre PROCEDURE
och var och en innehåller en COMMIT
kan du inte köra alla tre. Om ett undantag inträffar i en senare, ROLLBACK
dem alla eftersom ändringarna från de två första redan kommer att vara COMMIT
ted.
Som en allmän regel bör du inte använd COMMIT
i en PROCEDURE
eller FUNCTION
men bör överlåta till den som ringer att COMMIT
transaktionen så att de kan kombinera flera åtgärder.
Det finns naturligtvis användningsfall där du kommer att vilja bryta mot denna regel, men du bör överväga varje fall separat och ta dig tid att helt förstå din affärslogik innan du bryter mot denna regel så att du vet vad som är COMMIT
i varje instans.
Ska jag göra den här transaktionen som
AUTONOMOUS_TRANSACTION
?
Ett användningsfall är loggning - du kan ha en PROCEDURE
som anropar en annan PROCEDURE
för att logga användarens åtgärder och, oavsett om den initiala åtgärden lyckas eller misslyckas, vill du föra en logg över åtgärden och se till att loggen är COMMIT
ted. I det här fallet loggnings PROCEDURE
ska vara en AUTONOMOUS_TRANSACTION
och innehåller en COMMIT
uttalandet och det anropande uttalandet bör (förmodligen) inte ha någotdera.
Så, om COMMIT
av en PROCEDURE
krävs alltid och är oberoende av om den som ringer COMMIT
s andra data gör sedan PROCEDURE
en AUTONOMOUS_TRANSACTION
. Om PROCEDURE
s kan buntas ihop och sedan ROLLBACK
som en grupp vill du inte göra dem till AUTONOMOUS_TRANSACTION
s.