Hvad er effekten af at placere commit på denne måde i programmet?
Oracle-dokumentationen beskriver COMMIT
som:
Formål
Brug COMMIT
erklæring for at afslutte din nuværende transaktion og gøre alle ændringer udført i transaktionen permanente. En transaktion er en sekvens af SQL-sætninger, som Oracle Database behandler som en enkelt enhed. Denne erklæring sletter også alle lagringspunkter i transaktionen og frigiver transaktionslåse.
Hvis du har tre PROCEDURE
og hver enkelt indeholder en COMMIT
sætning, så kan du ikke køre alle tre. Hvis der opstår en undtagelse i en sidstnævnte, ROLLBACK
dem alle, da ændringerne fra de to første allerede vil være COMMIT
ted.
Som en generel regel bør du ikke brug COMMIT
i en PROCEDURE
eller FUNCTION
men bør overlade det til den, der ringer, at COMMIT
transaktionen, så de kan samle flere handlinger sammen.
Der er selvfølgelig brugssager, hvor du ønsker at overtræde denne regel, men du bør overveje hver sag separat og tage dig tid til fuldt ud at forstå din forretningslogik, før du bryder denne regel, så du ved, hvad der er COMMIT
ted i hvert enkelt tilfælde.
Skal jeg foretage denne transaktion som AUTONOMOUS_TRANSACTION
?
En use-case er logning - du har muligvis en PROCEDURE
som kalder en anden PROCEDURE
for at logge brugerens handlinger, og uanset om den indledende handling lykkes eller mislykkes, vil du føre en log over handlingen og sikre, at loggen er COMMIT
ted. I dette tilfælde logges PROCEDURE
skal være en AUTONOMOUS_TRANSACTION
og indeholder en COMMIT
sætning og den kaldende erklæring bør (formentlig) ikke have nogen af delene.
Så hvis COMMIT
af én PROCEDURE
er altid påkrævet og er uafhængig af om den, der ringer, COMMIT
s andre data lav derefter PROCEDURE
en AUTONOMOUS_TRANSACTION
. Hvis PROCEDURE
s kan bundtes sammen og derefter ROLLBACK
som en gruppe, så ønsker du ikke at gøre dem til AUTONOMOUS_TRANSACTION
s.