Transakcja autonomiczna w Oracle PL/SQL: Zatwierdź, wycofaj

Czym są instrukcje TCL w języku PL/SQL?

TCL oznacza oświadczenia dotyczące kontroli transakcji. Zapisze oczekujące transakcje lub wycofa oczekującą transakcję. Wyciągi te odgrywają kluczową rolę, ponieważ jeśli transakcja nie zostanie zapisana, zmiany dokonane za pomocą wyciągów DML nie zostaną zapisane w bazie danych. Poniżej znajdują się różne oświadczenia TCL.

POPEŁNIĆ Zapisuje wszystkie oczekujące transakcje
COFNIĘCIE Odrzuć wszystkie oczekujące transakcje
PUNKT ZAPISU Tworzy punkt w transakcji, do którego wycofanie może zostać wykonane później
POWRÓT DO Odrzuć wszystkie oczekujące transakcje do określonego czasu

Transakcja zostanie zrealizowana zgodnie z poniższymi scenariuszami.

  • Kiedy zostanie wydane którekolwiek z powyższych oświadczeń (z wyjątkiem SAVEPOINT)
  • Kiedy wydawane są instrukcje DDL. (DDL to instrukcje automatycznego zatwierdzania)
  • KIEDY wydawane są wyciągi DCL. (DCL to instrukcje automatycznego zatwierdzania)

Co to jest transakcja autonomiczna

W PL/SQL wszystkie modyfikacje danych będą nazywane transakcją. Transakcję uznaje się za zakończoną w momencie zastosowania do niej zapisu/odrzucenia. Jeżeli nie zostanie podany zapis/odrzucenie, transakcja nie zostanie uznana za zakończoną, a modyfikacje dokonane na danych nie zostaną trwale zapisane na serwerze.

Niezależnie od pewnych modyfikacji dokonanych w trakcie sesji, PL / SQL potraktuje całą modyfikację jako pojedynczą transakcję, a zapisanie/odrzucenie tej transakcji ma wpływ na wszystkie oczekujące zmiany w tej sesji. Transakcja autonomiczna zapewnia programiście funkcjonalność, która umożliwia wprowadzanie zmian w oddzielnej transakcji i zapisywanie/odrzucanie tej konkretnej transakcji bez wpływu na transakcję sesji głównej.

  • Tę autonomiczną transakcję można określić na poziomie podprogramu.
  • Aby dowolny podprogram mógł pracować w innej transakcji należy w części deklaratywnej tego bloku podać słowo kluczowe 'PRAGMA AUTONOMOUS_TRANSATION'.
  • Poinstruuje kompilator, aby potraktował to jako osobną transakcję, a zapisanie/odrzucenie w tym bloku nie będzie odzwierciedlone w głównej transakcji.
  • Wystawienie COMMIT lub ROLLBACK jest obowiązkowe przed wyjściem z tej autonomicznej transakcji do transakcji głównej, gdyż w danym momencie może być aktywna tylko jedna transakcja.
  • Kiedy więc dokonamy autonomicznej transakcji, musimy ją zapisać i dokończyć transakcję, wtedy dopiero możemy wrócić do głównej transakcji.

Składnia:

DECLARE
PRAGMA AUTONOMOUS_TRANSACTION; 
.
BEGIN
<executin_part>
[COMMIT|ROLLBACK]
END;
/
  • W powyższej składni blok został wykonany jako transakcja autonomiczna.

1 przykład: W tym przykładzie zrozumiemy, jak działa transakcja autonomiczna.

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;

Wydajność

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

Transakcja autonomiczna

Wyjaśnienie kodu:

  • Linia kodu 2: Deklarowanie l_salary jako NUMBER.
  • Linia kodu 3: Deklarowanie procedury Nened_block
  • Linia kodu 4: Wykonywanie procedury zagnieżdżonej_bloku jako „AUTONOMOUS_TRANSACTION”.
  • Linia kodu 7-9: Podwyższenie wynagrodzenia pracownika nr 1002 o 15000.
  • Linia kodu 10: Zatwierdzenie transakcji.
  • Linia kodu 13-16: Drukowanie szczegółów wynagrodzenia pracownika 1001 i 1002 przed zmianami.
  • Linia kodu 17-19: Podwyższenie wynagrodzenia pracownika nr 1001 o 5000.
  • Linia kodu 20: Wywołanie procedurynested_block;
  • Linia kodu 21: Odrzucenie głównej transakcji.
  • Linia kodu 22-25: Drukowanie szczegółów wynagrodzenia pracownika 1001 i 1002 po zmianach.
  • Podwyżka wynagrodzenia pracownika nr 1001 nie jest uwzględniona, ponieważ główna transakcja została odrzucona. Podwyżka wynagrodzenia dla pracownika nr 1002 jest uwzględniana, ponieważ blok ten został dokonany jako osobna transakcja i zapisany na końcu.
  • Zatem niezależnie od zapisania/odrzucenia w transakcji głównej, zmiany w transakcji autonomicznej zostały zapisane bez wpływu na zmiany w transakcji głównej.