Autonome Transaktion in Oracle PL / SQL: Commit, Rollback

Inhaltsverzeichnis:

Anonim

Was sind TCL-Anweisungen in PL / SQL?

TCL steht für Transaction Control Statements. Es werden entweder die ausstehenden Transaktionen gespeichert oder die ausstehenden Transaktionen zurückgesetzt. Diese Anweisungen spielen eine wichtige Rolle, da die Änderungen durch DML-Anweisungen nicht in der Datenbank gespeichert werden, es sei denn, die Transaktion wird gespeichert. Nachfolgend sind die verschiedenen TCL-Anweisungen aufgeführt.

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

Die Transaktion wird in den folgenden Szenarien abgeschlossen.

  • Wenn eine der oben genannten Erklärungen abgegeben wird (außer SAVEPOINT)
  • Wenn DDL-Anweisungen ausgegeben werden. (DDL sind Auto-Commit-Anweisungen)
  • WENN DCL-Anweisungen ausgegeben werden. (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 das Speichern / Verwerfen auf sie angewendet wird. Wenn kein Speichern / Verwerfen angegeben ist, wird die Transaktion nicht als abgeschlossen betrachtet und die an den Daten vorgenommenen Änderungen werden nicht dauerhaft auf dem Server vorgenommen.

Unabhängig von einigen Änderungen, die während einer Sitzung vorgenommen wurden, behandelt PL / SQL die gesamte Änderung als einzelne Transaktion und das Speichern / Verwerfen dieser Transaktion wirkt sich auf die gesamten ausstehenden Änderungen in dieser Sitzung aus. Autonome Transaktion 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 beeinflussen.

  • Diese autonome Transaktion kann auf Unterprogrammebene angegeben werden.
  • Damit ein Unterprogramm in einer anderen Transaktion funktioniert, sollte das Schlüsselwort 'PRAGMA AUTONOMOUS_TRANSATION' im deklarativen Abschnitt dieses Blocks angegeben werden.
  • Der Compiler wird angewiesen, dies als separate Transaktion zu behandeln, und das Speichern / Verwerfen in diesem Block wird in der Haupttransaktion nicht berücksichtigt.
  • Die Ausgabe von COMMIT oder ROLLBACK ist obligatorisch, bevor diese autonome Transaktion zur Haupttransaktion verschoben wird, da jederzeit nur eine Transaktion aktiv sein kann.
  • Sobald wir eine autonome Transaktion durchgeführt haben, müssen wir sie speichern und abschließen. Nur wir können zur Haupttransaktion zurückkehren.

Syntax:

DECLAREPRAGMA AUTONOMOUS_TRANSACTION;.BEGIN[COMMIT|ROLLBACK]END;/
  • In der obigen Syntax wurde der Block als autonome Transaktion ausgeführt.

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

DECLAREl_salary NUMBER;PROCEDURE nested_block ISPRAGMA autonomous_transaction;BEGINUPDATE empSET salary = salary + 15000WHERE emp_no = 1002;COMMIT;END;BEGINSELECT 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 empSET salary = salary + 5000WHERE 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;

Ausgabe

Before:Salary of 1001 is 15000Before:Salary of 1002 is 10000After:Salary of 1001 is 15000After:Salary of 1002 is 25000

Code Erläuterung:

  • Codezeile 2 : Deklarieren von l_salary als NUMBER.
  • Codezeile 3 : Deklarieren der Prozedur nested_block
  • Codezeile 4 : Prozedur nested_block als 'AUTONOMOUS_TRANSACTION' erstellen.
  • Codezeile 7-9: Erhöhung des Gehalts für Mitarbeiter Nummer 1002 um 15000.
  • Codezeile 10: Festschreiben der Transaktion.
  • Codezeile 13-16: Drucken der Gehaltsdetails der Mitarbeiter 1001 und 1002 vor Änderungen.
  • Codezeile 17-19: Erhöhung des Gehalts für Mitarbeiter Nummer 1001 um 5000.
  • Codezeile 20: Aufruf der Prozedur nested_block;
  • Codezeile 21: Verwerfen der Haupttransaktion.
  • Codezeile 22-25: Drucken der Gehaltsdetails der Mitarbeiter 1001 und 1002 nach Änderungen.
  • Die Gehaltserhöhung für Mitarbeiter Nummer 1001 wird nicht berücksichtigt, da die Haupttransaktion verworfen wurde. Die Gehaltserhöhung für Mitarbeiter Nummer 1002 spiegelt sich wider, da dieser Block 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 die Änderungen der Haupttransaktion zu beeinflussen.