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.

  • 💾 BEGEHEN: Macht alle ausstehenden DML-Änderungen permanent, beendet die Transaktion, gibt Sperren frei und löscht alle Speicherpunkte.
  • RÜCKGÄNGIG GEMACHT: Macht ausstehende Änderungen rückgängig, entweder die gesamte Transaktion oder einen festgelegten Speicherpunkt.
  • 📌 SPEICHERPUNKT: Markiert einen Punkt innerhalb einer Transaktion, sodass ein späteres ROLLBACK TO nur einen Teil der Arbeit rückgängig machen kann.
  • 🔀 Autonome Transaktion: Die Direktive PRAGMA AUTONOMOUS_TRANSACTION ermöglicht es einem Unterprogramm, selbstständig einen Commit oder Rollback durchzuführen.
  • 🧾 Anwendungsfälle: Autonome Transaktionen eignen sich für die Protokollierung von Prüfungen und Fehlern, die auch dann erhalten bleiben müssen, wenn die Hauptoperation rückgängig gemacht wird.
  • 🤖 KI-Unterstützung: KI-Assistenten wie GitHub Copilot entwerfen COMMIT-, ROLLBACK- und PRAGMA-Blöcke und kennzeichnen fehlende Commits.

Autonome Transaktion in Oracle PL/SQL mit COMMIT und ROLLBACK

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.

Beispiel einer autonomen Transaktion: Ein verschachtelter Block wird festgeschrieben, während die Haupttransaktion zurückgerollt wird. Oracle PL / SQL

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.

Häufig gestellte Fragen

Oracle Es wird ORA-06519 ausgelöst und die autonome Transaktion wird rückgängig gemacht. Jede autonome Transaktion muss mit einem expliziten COMMIT oder ROLLBACK abgeschlossen werden, bevor die Kontrolle an die Haupttransaktion zurückgegeben wird, da jeweils nur eine aktive Transaktion zulässig ist.

Nicht direkt. Ein normaler Trigger kann weder COMMIT noch ROLLBACK ausführen. Durch die Deklaration des Triggers oder einer von ihm aufgerufenen Prozedur mit PRAGMA AUTONOMOUS_TRANSACTION kann er seine eigenen Änderungen unabhängig von der Anweisung, die den Trigger ausgelöst hat, festschreiben.

Nein. Sobald die übergeordnete Transaktion angehalten wird, läuft die autonome Transaktion unabhängig und kann die nicht gespeicherten Änderungen der übergeordneten Transaktion nicht sehen. Sie sieht nur die bereits in der Datenbank gespeicherten Daten, daher kann das Warten auf eine Sperre der übergeordneten Transaktion zu einem Deadlock führen.

Ja. Jede DDL-Anweisung, wie z. B. CREATE, ALTER oder DROP, führt vor und nach ihrer Ausführung implizit ein COMMIT aus. Alle ausstehenden DML-Anweisungen in der Sitzung werden automatisch festgeschrieben, sodass eine DDL-Anweisung im Nachhinein nicht rückgängig gemacht werden kann.

Ein autonomer Block kann einen anderen aufrufen, und jeder verwaltet seinen eigenen COMMIT oder ROLLBACK. Oracle Die Anzahl der gleichzeitig aktiven Transaktionen wird durch den Initialisierungsparameter TRANSACTIONS begrenzt, sodass sehr tiefe Verschachtelungen autonomer Blöcke fehlschlagen können.

Nein. Ein COMMIT macht Änderungen dauerhaft, gibt Sperren frei und löscht Speicherpunkte. Daher kann er nicht mit ROLLBACK rückgängig gemacht werden. Um gespeicherte Daten rückgängig zu machen, müssen Sie neue DML-Anweisungen ausführen. Verwenden Sie SAVEPOINT und ROLLBACK TO für eine teilweise Rückgängigmachung vor dem Commit.

Ja. GitHub-Copilot Entwirft COMMIT- und ROLLBACK-Logik, SAVEPOINT-Blöcke und PRAGMA AUTONOMOUS_TRANSACTION-Prozeduren aus einem Kommentar. RevBeachten Sie die Platzierung des Commits und die Fehlerbehandlung, da ein falsch platzierter Commit die Transaktionsgrenzen beschädigen kann.

KI-Assistenten scannen Prozeduren auf fehlende oder falsch platzierte COMMIT- und ROLLBACK-Anweisungen, Commits innerhalb von Schleifen und nicht geschlossene autonome Blöcke. Diese maschinelle Lernprüfung kennzeichnet Transaktionsfehler und schlägt sicherere Grenzen vor, bevor der Code in Produktion geht.

Fassen Sie diesen Beitrag mit folgenden Worten zusammen: