sql >> Databasteknik >  >> RDS >> Oracle

Vad är effekten av att placera commit efter DML i proceduren?

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.



  1. Ett par små problem med Hekaton-prover

  2. Flera CTE i en enda fråga

  3. En översikt över ProxySQL-klustring i ClusterControl

  4. Vad är NoSQL och hur används det?