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
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.