sql >> Database teknologi >  >> RDS >> Oracle

Hvad er effekten af ​​at placere commit efter DML i procedure?

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.



  1. PSQLEundtagelse:ResultSet er ikke placeret korrekt, måske skal du ringe næste gang

  2. Forbindelsespuljen for databasen '/data/data/msv_database.db' har ikke været i stand til at give en forbindelse. Forbindelser:0 aktiv, 1 inaktiv, 0 tilgængelig

  3. Refaktorer en PL/pgSQL-funktion for at returnere output fra forskellige SELECT-forespørgsler

  4. Dvale gemmer brugermodel til Postgres