Autonome Transaktion in Oracle PL/SQL: Commit, Rollback

Was sind TCL-Anweisungen in PL/SQL?

TCL steht für Transaction Control Statements. Die ausstehenden Transaktionen werden entweder gespeichert oder die ausstehende Transaktion wird rückgängig gemacht. Diese Anweisungen spielen eine entscheidende Rolle, da die durch DML-Anweisungen vorgenommenen Änderungen nicht in der Datenbank gespeichert werden, sofern die Transaktion nicht gespeichert wird. Nachfolgend finden Sie die verschiedenen TCL-Anweisungen.

VERPFLICHTEN Speichert alle ausstehenden Transaktionen
ZURÜCKSETZEN Verwerfen Sie alle ausstehenden Transaktionen
SPEICHERPUNKT Erstellt einen Punkt in der Transaktion, bis zu dem später ein Rollback durchgeführt werden kann
ROLLBACK AUF Verwerfen Sie alle ausstehenden Transaktionen bis zum angegebenen Datum

Die Transaktion wird unter den folgenden Umständen abgeschlossen.

  • Wenn eine der oben genannten Anweisungen ausgegeben wird (außer SAVEPOINT)
  • Wenn DDL-Anweisungen ausgegeben werden. (DDL sind Auto-Commit-Anweisungen)
  • WHEN DCL-Anweisungen werden ausgegeben. (DCL sind Auto-Commit-Anweisungen)

Was ist autonome Transaktion?

In PL/SQL werden alle an Daten vorgenommenen Änderungen als Transaktion bezeichnet. Eine Transaktion gilt als abgeschlossen, wenn die Option „Speichern/Verwerfen“ auf sie angewendet wird. Wenn kein Speichern/Verwerfen angegeben ist, gilt die Transaktion nicht als abgeschlossen und die an den Daten vorgenommenen Änderungen werden nicht dauerhaft auf dem Server gespeichert.

Unabhängig von einigen Änderungen, die während einer Sitzung vorgenommen wurden, PL / SQL behandelt die gesamte Änderung als eine einzelne Transaktion und das Speichern/Verwerfen dieser Transaktion wirkt sich auf alle ausstehenden Änderungen in dieser Sitzung aus. Autonomous Transaction bietet dem Entwickler eine Funktionalität, mit der er Änderungen in einer separaten Transaktion vornehmen und diese bestimmte Transaktion speichern/verwerfen kann, ohne die Hauptsitzungstransaktion zu beeinträchtigen.

  • Diese autonome Transaktion kann auf Unterprogrammebene spezifiziert werden.
  • Damit ein Unterprogramm in einer anderen Transaktion funktioniert, muss das Schlüsselwort „PRAGMA AUTONOMOUS_TRANSATION“ im deklarativen Abschnitt dieses Blocks angegeben werden.
  • Dadurch wird der Compiler angewiesen, dies als separate Transaktion zu behandeln, und das Speichern/Verwerfen innerhalb dieses Blocks wird sich nicht in der Haupttransaktion widerspiegeln.
  • Das Ausgeben von COMMIT oder ROLLBACK ist obligatorisch, bevor von dieser autonomen Transaktion zur Haupttransaktion übergegangen wird, da immer nur eine Transaktion aktiv sein kann.
  • Sobald wir also eine autonome Transaktion durchgeführt haben, müssen wir sie speichern und abschließen, dann können nur wir zur Haupttransaktion zurückkehren.

Syntax:

DECLARE
PRAGMA AUTONOMOUS_TRANSACTION; 
.
BEGIN
<executin_part>
[COMMIT|ROLLBACK]
END;
/
  • In der obigen Syntax wurde der Block als autonome Transaktion erstellt.

Beispiel 1: In diesem Beispiel werden wir verstehen, wie die autonome Transaktion funktioniert.

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

Autonome Transaktion

Code-Erklärung:

  • Codezeile 2: l_salary als NUMBER deklarieren.
  • Codezeile 3: Nested_block-Prozedur deklarieren
  • Codezeile 4: Nested_block-Prozedur als „AUTONOMOUS_TRANSACTION“ erstellen.
  • Codezeile 7-9: Erhöhung des Gehalts für Mitarbeiter Nr. 1002 um 15000.
  • Codezeile 10: Bestätigen der Transaktion.
  • Codezeile 13-16: Ausdrucken der Gehaltsdetails der Mitarbeiter 1001 und 1002 vor den Änderungen.
  • Codezeile 17-19: Erhöhung des Gehalts für Mitarbeiter Nr. 1001 um 5000.
  • Codezeile 20: Aufrufen der Prozedur „nested_block“;
  • Codezeile 21: Verwerfen der Haupttransaktion.
  • Codezeile 22-25: Ausdrucken der Gehaltsdetails der Mitarbeiter 1001 und 1002 nach Änderungen.
  • Die Gehaltserhöhung für die Mitarbeiternummer 1001 wird nicht berücksichtigt, da der Hauptvorgang verworfen wurde. Die Gehaltserhöhung für die Mitarbeiternummer 1002 wird dadurch berücksichtigt, dass diese Sperre als separate Transaktion vorgenommen und am Ende gespeichert wurde.
  • Unabhängig vom Speichern/Verwerfen bei der Haupttransaktion wurden die Änderungen bei der autonomen Transaktion gespeichert, ohne dass sich dies auf die Änderungen der Haupttransaktion auswirkte.