Autonome Transaktion in Oracle PL / SQL
⚡ Intelligente Zusammenfassung
Transaktionskontrollanweisungen in Oracle PL/SQL, insbesondere COMMIT, ROLLBACK und SAVEPOINT, entscheiden darüber, ob ausstehende DML-Änderungen gespeichert oder verworfen werden. Eine autonome Transaktion wird als unabhängiges Unterprogramm ausgeführt, das unabhängig von der Haupttransaktion einen Commit oder Rollback durchführt.

Was sind TCL-Anweisungen in PL/SQL?
TCL steht für Transaction Control Statements (Transaktionssteuerungsanweisungen). Diese Anweisungen speichern oder machen ausstehende Transaktionen rückgängig. Sie spielen eine entscheidende Rolle, denn solange eine Transaktion nicht gespeichert wird, bleiben die vorgenommenen Änderungen bestehen. DML-Anweisungen werden nicht dauerhaft in der Datenbank gespeichert. Nachfolgend sind die verschiedenen TCL-Anweisungen aufgeführt. PL / SQL.
| Erklärung | Beschreibung |
|---|---|
| VERPFLICHTEN | Speichert alle ausstehenden Transaktionen. |
| ZURÜCKSETZEN | Verwirft alle ausstehenden Transaktionen. |
| SPEICHERPUNKT | Erstellt einen Punkt in der Transaktion, bis zu dem später ein Rollback durchgeführt werden kann. |
| ROLLBACK AUF | Verwirft alle bis zum angegebenen Speicherpunkt ausstehenden Transaktionen. |
Die Transaktion wird in folgenden Szenarien abgeschlossen:
- Wenn eine der oben genannten Anweisungen erteilt wird (mit Ausnahme von SAVEPOINT).
- Wenn DDL-Anweisungen ausgegeben werden (DDL sind Auto-Commit-Anweisungen).
- Wenn DCL-Anweisungen ausgegeben werden (DCLs sind Auto-Commit-Anweisungen).
Verwendung von SAVEPOINT und ROLLBACK TO
Die obige Tabelle stellt SAVEPOINT und ROLLBACK TO vor. Zusammen ermöglichen sie eine teilweise Kontrolle über eine Transaktion. Ein SAVEPOINT markiert einen benannten Punkt innerhalb der aktuellen Transaktion. Ein späteres ROLLBACK TO an diesem Speicherpunkt macht alle Änderungen rückgängig, die danach vorgenommen wurden, und behält die ursprünglichen Änderungen bei.ping Die zuvor geleistete Arbeit bleibt unberührt.
Dies ist nützlich, wenn eine lange Transaktion mehrere Schritte ausführt. SQL Die Transaktion schlägt nach mehreren Schritten fehl, wobei nur der letzte Schritt fehlschlägt. Anstatt die gesamte Transaktion zu verwerfen, können Sie zum letzten erfolgreichen Speicherpunkt zurückkehren und fortfahren.
Syntax:
SAVEPOINT <savepoint_name>; -- one or more DML statements ROLLBACK TO <savepoint_name>;
Wichtige Punkte, die Sie sich zu Speicherpunkten merken sollten:
- Ein Speicherpunkt existiert nur innerhalb der aktuellen Transaktion; ein COMMIT oder ein vollständiger ROLLBACK löscht jeden Speicherpunkt.
- Wenn Sie zu einem Speicherpunkt zurückkehren, werden alle danach erstellten Speicherpunkte gelöscht, der Speicherpunkt, zu dem Sie zurückkehren, bleibt jedoch erhalten.
- ROLLBACK TO beendet die Transaktion nicht; die vor dem Speicherpunkt vorgenommenen Änderungen bleiben ausstehend, bis Sie COMMIT oder ROLLBACK ausführen.
- Wenn Sie einen Speicherpunktnamen wiederverwenden, verschiebt der neuere Speicherpunkt die Markierung an die spätere Position.
Da ROLLBACK TO die Transaktion offen lässt, entscheiden Sie am Ende immer noch, ob Sie die verbleibenden Änderungen mit COMMIT übernehmen oder sie mit einem vollständigen ROLLBACK verwerfen.
Was ist autonome Transaktion?
In PL/SQL werden alle Datenänderungen als Transaktion bezeichnet. Eine Transaktion gilt als abgeschlossen, sobald sie gespeichert oder verworfen wurde. Wird dies nicht angegeben, gilt die Transaktion als nicht abgeschlossen, und die Datenänderungen werden nicht dauerhaft auf dem Server gespeichert.
Standardmäßig behandelt PL/SQL alle Änderungen während einer Sitzung als eine einzige Transaktion. Das Speichern oder Verwerfen dieser Transaktion wirkt sich auf alle ausstehenden Änderungen in der Sitzung aus. Eine autonome Transaktion ermöglicht es dem Entwickler, Änderungen in einer separaten Transaktion vorzunehmen und diese Transaktion zu speichern oder zu verwerfen, ohne die Haupttransaktion der Sitzung zu beeinflussen.
- Eine autonome Transaktion kann auf der Ebene des Unterprogramms spezifiziert werden.
- Um irgendetwas zu machen Unterprogramm Wenn Sie in einer anderen Transaktion arbeiten, muss das Schlüsselwort PRAGMA AUTONOMOUS_TRANSACTION im Deklarationsteil dieses Blocks angegeben werden.
- Es weist den Compiler an, dies als separate Transaktion zu behandeln, und das Speichern oder Verwerfen innerhalb dieses Blocks wirkt sich nicht auf die Haupttransaktion aus.
- Die Ausführung von COMMIT oder ROLLBACK ist zwingend erforderlich, bevor diese autonome Transaktion verlassen und zur Haupttransaktion zurückgekehrt werden kann, da zu jedem Zeitpunkt nur eine Transaktion aktiv sein kann.
- Sobald eine autonome Transaktion gestartet wurde, muss diese gespeichert und abgeschlossen werden, bevor die Kontrolle wieder auf die Haupttransaktion zurückgeführt werden kann.
Syntax:
DECLARE PRAGMA AUTONOMOUS_TRANSACTION; . BEGIN <execution_part> [COMMIT|ROLLBACK] END; /
In der obigen Syntax wurde der Block zu einer autonomen Transaktion gemacht.
Beispiel 1: In diesem Beispiel werden wir verstehen, wie eine autonome Transaktion funktioniert.
Der folgende Screenshot zeigt dieses Beispiel einer autonomen Transaktion und deren Ausgabe. Oracle.
DECLARE l_salary NUMBER; PROCEDURE nested_block IS PRAGMA autonomous_transaction; BEGIN UPDATE emp SET salary = salary + 15000 WHERE emp_no = 1002; COMMIT; END; BEGIN SELECT salary INTO l_salary FROM emp WHERE emp_no = 1001; dbms_output.put_line('Before Salary of 1001 is'|| l_salary); SELECT salary INTO l_salary FROM emp WHERE emp_no = 1002; dbms_output.put_line('Before Salary of 1002 is'|| l_salary); UPDATE emp SET salary = salary + 5000 WHERE emp_no = 1001; nested_block; ROLLBACK; SELECT salary INTO l_salary FROM emp WHERE emp_no = 1001; dbms_output.put_line('After Salary of 1001 is'|| l_salary); SELECT salary INTO l_salary FROM emp WHERE emp_no = 1002; dbms_output.put_line('After Salary of 1002 is '|| l_salary); end;
Ausgang
Before:Salary of 1001 is 15000 Before:Salary of 1002 is 10000 After:Salary of 1001 is 15000 After:Salary of 1002 is 25000
Code Erläuterung:
- Code Zeile 2: Deklaration von l_salary als NUMBER.
- Code Zeile 3: Deklaration der nested_block-Prozedur.
- Code Zeile 4: Die nested_block-Prozedur wird zu einer AUTONOMOUS_TRANSACTION.
- Code Zeile 7-9: Erhöhung des Gehalts für Mitarbeiter Nr. 1002 um 15000.
- Code Zeile 10: Die autonome Transaktion wird ausgeführt.
- Code Zeile 13-16: Drucken der Gehaltsdetails der Mitarbeiter 1001 und 1002 vor den Änderungen.
- Code Zeile 17-19: Erhöhung des Gehalts für Mitarbeiter Nr. 1001 um 5000.
- Code Zeile 20: Aufruf der Prozedur nested_block.
- Code Zeile 21: Verwerfen der Haupttransaktion.
- Code Zeile 22-25: Drucken der Gehaltsdetails der Mitarbeiter 1001 und 1002 nach den Änderungen.
Die Gehaltserhöhung für Mitarbeiter Nr. 1001 wird nicht berücksichtigt, da die Haupttransaktion verworfen wurde. Die Gehaltserhöhung für Mitarbeiter Nr. 1002 wird berücksichtigt, da dieser Vorgang separat abgewickelt und am Ende gespeichert wurde.
Unabhängig davon, ob die Haupttransaktion gespeichert oder verworfen wird, werden die Änderungen in der autonomen Transaktion gespeichert, ohne die Haupttransaktion zu beeinträchtigen.
Wann sollte man autonome Transaktionen verwenden?
Autonome Transaktionen sind leistungsstark, daher ist es wichtig zu wissen, wann sie sinnvoll sind. Verwenden Sie sie für Vorgänge, die unabhängig von der Haupttransaktion erfolgreich sein oder fehlschlagen müssen, und nicht für die Kernlogik des Unternehmens. Typische Anwendungsfälle sind:
- Audit-Protokollierung: Protokollieren Sie, wer sensible Daten wann geändert hat und welche alten und neuen Werte verwendet wurden, damit das Protokoll auch dann erhalten bleibt, wenn die Haupttransaktion rückgängig gemacht wird.
- Fehlerprotokollierung: Schreibe einen Fehlerdatensatz innerhalb eines Ausnahme handler und COMMIT it, so dass die Diagnosedetails erhalten bleiben, während die fehlgeschlagene Transaktion verworfen wird.
- Zähler und Statistiken: Erhöhen Sie einen Nutzungs- oder Trefferzähler, der unabhängig vom Ergebnis des Aufrufs erhalten bleiben muss.
- COMMIT innerhalb eines Triggers: Ein Trigger kann nicht direkt einen COMMIT-Befehl ausführen; eine autonome Transaktion ist die einzige unterstützte Methode hierfür.
Vermeiden Sie autonome Transaktionen für gewöhnliche Aktualisierungen, die das gleiche Schicksal wie die Haupttransaktion haben sollen. Der übermäßige Einsatz autonomer Transaktionen kann Daten hinter unabhängigen Commits verbergen und die Fehlersuche erschweren. Grundsätzlich muss jeder autonome Block mit einem expliziten COMMIT oder ROLLBACK abgeschlossen werden.
Autonome vs. reguläre Transaktionen
Der Unterschied zwischen einer regulären (Haupt-)Transaktion und einer autonomen Transaktion liegt in ihrem Umfang und ihrer Unabhängigkeit. Die folgende Tabelle vergleicht sie.
| Aspekt | Regelmäßige Transaktion | Autonome Transaktion |
|---|---|---|
| Geltungsbereich | Teilt eine Sitzungstransaktion | Wird als separate untergeordnete Transaktion ausgeführt |
| COMMIT-/ROLLBACK-Effekt | Betrifft alle ausstehenden Sitzungsänderungen | Betrifft nur den autonomen Block |
| Erklärung | Standardverhalten | PRAGMA AUTONOMOUS_TRANSACTION im deklarativen Abschnitt |
| Auswirkung des übergeordneten Rollbacks | Änderungen gehen verloren | Festgelegte autonome Änderungen werden beibehalten |
| Typische Verwendung | Kernlogik des Geschäftsbetriebs | Protokollierung von Prüfungen und Fehlern |
Im Gegensatz zu einem regulären verschachtelter BlockWährend sich Änderungen an einem übergeordneten Block stets auf dessen Ergebnis beziehen, steht ein autonomer Block für sich allein. Dieses Verständnis hilft Ihnen zu entscheiden, wann ein Block unabhängig sein und wann er das Ergebnis der übergeordneten Transaktion teilen sollte.

