Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Welchen Effekt hat es, wenn der Commit nach DML in der Prozedur platziert wird?

Welchen Effekt hat es, den Commit so im Programm zu platzieren?

Die Oracle-Dokumentation beschreibt COMMIT als:

Zweck

Verwenden Sie den COMMIT Anweisung, um Ihre aktuelle Transaktion zu beenden und alle in der Transaktion vorgenommenen Änderungen dauerhaft zu machen. Eine Transaktion ist eine Folge von SQL-Anweisungen, die von Oracle Database als einzelne Einheit behandelt werden. Diese Anweisung löscht auch alle Sicherungspunkte in der Transaktion und hebt Transaktionssperren auf.

Wenn Sie drei PROCEDURE haben und jeder enthält ein COMMIT -Anweisung, dann können Sie nicht alle drei ausführen, wenn in einer letzteren eine Ausnahme auftritt, ROLLBACK sie alle, da die Änderungen der ersten beiden bereits COMMIT sein werden ted.

In der Regel sollten Sie dies nicht tun Verwenden Sie COMMIT in einem PROCEDURE oder FUNCTION sollte es aber dem Aufrufer überlassen, COMMIT auszuführen die Transaktion, damit sie mehrere Aktionen bündeln können.

Es gibt natürlich Anwendungsfälle, in denen Sie gegen diese Regel verstoßen möchten, aber Sie sollten jeden Fall separat betrachten und sich die Zeit nehmen, Ihre Geschäftslogik vollständig zu verstehen, bevor Sie gegen diese Regel verstoßen, damit Sie wissen, was COMMIT ist ted in jedem Fall.

Soll ich diese Transaktion als AUTONOMOUS_TRANSACTION durchführen ?

Ein Anwendungsfall ist die Protokollierung – möglicherweise haben Sie ein PROCEDURE die eine andere PROCEDURE aufruft um die Aktionen des Benutzers zu protokollieren, und unabhängig davon, ob die anfängliche Aktion erfolgreich war oder fehlschlägt, möchten Sie ein Protokoll der Aktion führen und sicherstellen, dass das Protokoll COMMIT ist ted. In diesem Fall die Protokollierung PROCEDURE sollte ein AUTONOMOUS_TRANSACTION sein und ein COMMIT enthalten -Anweisung und die aufrufende Anweisung sollten (wahrscheinlich) keine haben.

Wenn also der COMMIT eines PROCEDURE wird immer benötigt und ist unabhängig davon, ob der Aufrufer COMMIT s andere Daten machen dann das PROCEDURE eine AUTONOMOUS_TRANSACTION . Wenn das PROCEDURE s können gebündelt und dann ROLLBACK werden Als Gruppe möchten Sie sie dann nicht zu AUTONOMOUS_TRANSACTION machen s.