Tranzacție autonomă în Oracle PL / SQL: Commit, Rollback

Cuprins:

Anonim

Ce sunt declarațiile TCL în PL / SQL?

TCL înseamnă Declarații de control al tranzacțiilor. Fie va salva tranzacțiile în așteptare, fie va reveni la tranzacția în așteptare. Aceste declarații joacă rolul vital deoarece, dacă nu se salvează tranzacția, modificările prin instrucțiuni DML nu vor fi salvate în baza de date. Mai jos sunt diferite instrucțiuni TCL.

COMITEAZA Salvează toate tranzacțiile în așteptare
REALIZARE Renunțați la toate tranzacțiile în așteptare
SAVEPOINT Creează un punct în tranzacție până la care retragerea poate fi efectuată ulterior
REALIZARE LA Renunțați la toate tranzacțiile în așteptare până la specificat

Tranzacția va fi finalizată în următoarele scenarii.

  • Când se emite oricare dintre declarațiile de mai sus (cu excepția SAVEPOINT)
  • Când se emit declarații DDL. (DDL sunt declarații auto-commit)
  • CÂND sunt emise declarații DCL. (DCL sunt declarații auto-commit)

Ce este tranzacția autonomă

În PL / SQL, toate modificările efectuate pe date vor fi denumite tranzacție. O tranzacție este considerată completă atunci când se aplică salvarea / eliminarea acesteia. Dacă nu se oferă salvare / eliminare, atunci tranzacția nu va fi considerată completă, iar modificările efectuate pe date nu vor fi făcute permanente pe server.

Indiferent de unele modificări efectuate în timpul unei sesiuni, PL / SQL va trata întreaga modificare ca o singură tranzacție și salvarea / eliminarea acestei tranzacții afectează toate modificările în așteptare din acea sesiune. Tranzacția autonomă oferă dezvoltatorului o funcționalitate în care permite efectuarea modificărilor într-o tranzacție separată și salvarea / eliminarea acelei tranzacții fără a afecta tranzacția sesiunii principale.

  • Această tranzacție autonomă poate fi specificată la nivel de subprogram.
  • Pentru ca orice subprogram să funcționeze într-o altă tranzacție, cuvântul cheie „PRAGMA AUTONOMO_TRANSATION” ar trebui să fie dat în secțiunea declarativă a acelui bloc.
  • Acesta va instrui acel compilator să trateze acest lucru ca pe o tranzacție separată și salvarea / aruncarea în interiorul acestui bloc nu se va reflecta în tranzacția principală.
  • Emiterea COMMIT sau ROLLBACK este obligatorie înainte de a ieși din această tranzacție autonomă la tranzacția principală, deoarece în orice moment o singură tranzacție poate fi activă.
  • Deci, odată ce am făcut o tranzacție autonomă, trebuie să o salvăm și să finalizăm tranzacția, atunci doar noi putem trece înapoi la tranzacția principală.

Sintaxă:

DECLAREPRAGMA AUTONOMOUS_TRANSACTION;.BEGIN[COMMIT|ROLLBACK]END;/
  • În sintaxa de mai sus, blocul a fost realizat ca o tranzacție autonomă.

Exemplul 1 : În acest exemplu, vom înțelege cum funcționează tranzacția autonomă.

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;

Ieșire

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

Explicatie cod:

  • Linia de cod 2 : Declararea l_salary ca NUMĂR.
  • Linia de cod 3 : Declararea procedurii nested_block
  • Linia de cod 4 : Efectuarea procedurii nested_block ca „AUTONOMO_TRANSACTION”.
  • Linia de cod 7-9: Creșterea salariului pentru angajatul numărul 1002 cu 15000.
  • Linia de cod 10: Realizarea tranzacției.
  • Linia de cod 13-16: Tipărirea detaliilor salariale ale angajatului 1001 și 1002 înainte de modificări.
  • Linia de cod 17-19: Creșterea salariului pentru angajatul numărul 1001 cu 5000.
  • Linia de cod 20: Apelarea procedurii nested_block;
  • Linia de cod 21: Eliminarea tranzacției principale.
  • Linia de cod 22-25: Tipărirea detaliilor salariale ale angajatului 1001 și 1002 după modificări.
  • Creșterea salariului pentru numărul de angajați 1001 nu se reflectă deoarece tranzacția principală a fost abandonată. Creșterea salariului pentru numărul de angajați 1002 se reflectă deoarece blocul respectiv a fost făcut ca o tranzacție separată și salvat la final.
  • Deci, indiferent de salvare / aruncare la tranzacția principală, modificările la tranzacția autonomă au fost salvate fără a afecta modificările tranzacției principale.