Co to są instrukcje TCL w PL / SQL?
TCL to skrót od Transaction Control Statements. Zapisuje oczekujące transakcje lub wycofuje oczekującą transakcję. Te instrukcje odgrywają istotną rolę, ponieważ dopóki transakcja nie zostanie zapisana, zmiany za pomocą instrukcji DML nie zostaną zapisane w bazie danych. Poniżej znajdują się różne stwierdzenia TCL.
POPEŁNIĆ | Zapisuje wszystkie oczekujące transakcje |
ROLLBACK | Odrzuć wszystkie oczekujące transakcje |
PUNKT ZAPISU | Tworzy punkt w transakcji, do którego można później dokonać wycofania |
ROLLBACK TO | Odrzuć wszystkie oczekujące transakcje do określonego
|
Transakcja zostanie zakończona w następujących scenariuszach.
- W przypadku wydania któregokolwiek z powyższych oświadczeń (z wyjątkiem SAVEPOINT)
- Kiedy wydawane są instrukcje DDL. (DDL to instrukcje automatycznego zatwierdzania)
- GDY 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ą. Transakcja jest uważana za zakończoną, gdy zostanie do niej zastosowana opcja zapisania / odrzucenia. Jeśli nie zostanie podany zapis / odrzucenie, transakcja nie zostanie uznana za zakończoną, a zmiany wprowadzone w danych nie zostaną trwale wprowadzone na serwerze.
Niezależnie od pewnych modyfikacji wprowadzonych podczas sesji, PL / SQL potraktuje całą modyfikację jako pojedynczą transakcję i zapisanie / odrzucenie tej transakcji wpłynie na wszystkie oczekujące zmiany w tej sesji. Autonomous Transaction zapewnia deweloperowi funkcjonalność, w której pozwala na dokonywanie zmian w oddzielnej transakcji i zapisywanie / odrzucanie tej konkretnej transakcji bez wpływu na transakcję sesji głównej.
- Ta autonomiczna transakcja może zostać określona na poziomie podprogramu.
- Aby jakikolwiek podprogram działał w innej transakcji, w deklaratywnej sekcji tego bloku należy podać słowo kluczowe „PRAGMA AUTONOMOUS_TRANSATION”.
- Poinstruuje kompilator, aby traktował to jako oddzielną transakcję, a zapisywanie / odrzucanie wewnątrz tego bloku nie będzie odzwierciedlone w transakcji głównej.
- Wydanie COMMIT lub ROLLBACK jest obowiązkowe przed wyjściem z tej autonomicznej transakcji do transakcji głównej, ponieważ w dowolnym momencie aktywna może być tylko jedna transakcja.
- Więc kiedy już dokonaliśmy autonomicznej transakcji, musimy ją zapisać i zakończyć transakcję, wtedy tylko możemy wrócić do głównej transakcji.
Składnia:
DECLAREPRAGMA AUTONOMOUS_TRANSACTION;.BEGIN[COMMIT|ROLLBACK]END;/
- W powyższej składni blok został wykonany jako transakcja autonomiczna.
Przykład 1 : W tym przykładzie zrozumiemy, jak działa transakcja autonomiczna.
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;
Wynik
Before:Salary of 1001 is 15000Before:Salary of 1002 is 10000After:Salary of 1001 is 15000After:Salary of 1002 is 25000
Objaśnienie kodu:
- Linia kodu 2 : zadeklarowanie l_salary jako NUMBER.
- Linia kodu 3 : Deklarowanie procedury nested_block
- Linia kodu 4 : Wykonywanie procedury nested_block jako „AUTONOMOUS_TRANSACTION”.
- Linia kodu 7-9: Zwiększenie wynagrodzenia pracownika numer 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: Zwiększenie wynagrodzenia dla pracownika numer 1001 o 5000.
- Linia kodu 20: Wywołanie procedury nested_block;
- Linia kodu 21: Odrzucenie głównej transakcji.
- Linia kodu 22-25: Drukowanie szczegółów wynagrodzenia pracownika 1001 i 1002 po zmianach.
- Wzrost wynagrodzenia dla pracownika numer 1001 nie jest uwzględniany, ponieważ główna transakcja została odrzucona. Podwyższenie wynagrodzenia dla pracownika numer 1002 jest odzwierciedlone, ponieważ ten blok został wykonany jako osobna transakcja i zapisany na końcu.
- Zatem niezależnie od zapisu / odrzucenia w głównej transakcji, zmiany w autonomicznej transakcji zostały zapisane bez wpływu na główne zmiany transakcji.