Sposób działania transakcji w PL/SQL

0

Mam pytanie odnośnie korzystania z transakcji w PL/SQL. Czy po przechwyceniu wyjątku w poniższym przykładzie wszystkie zmiany w bazie wprowadzone przez procedury 1, 2 oraz 3 (procedury wykonują polecenia typu INSERT, UPDATE oraz CREATE) zostaną wycofane?

BEGIN
  procedura1(parametr1, parametr2, parametr3);
  procedura2(parametr1, parametr2);
  procedura3(parametr1);

EXCEPTION
WHEN OTHERS
THEN
  ROLLBACK;

END;

Czy konieczne jest użycie COMMIT? Czy ROLLBACK/COMMIT odwołuje się do konkretnego bloku wewnątrz którego się znajduje czy do całej procedury/funkcji która może zawierać więcej bloków? Czy po zmodyfikowaniu powyższego przykładu w sposób widoczny poniżej przechwycenie wyjątku spowoduje wykonanie pozostałych instrukcji czy program zachowa się w inny sposób? Jeśli tak to jaki?

CREATE OR REPLACE PROCEDURE jakaś_procedura
AS
BEGIN
  BEGIN
    procedura1(parametr1, parametr2, parametr3);
    procedura2(parametr1, parametr2);
    procedura3(parametr1);

  EXCEPTION
  WHEN OTHERS
  THEN
    ROLLBACK;

  END;
  
  //...pozostałe instrukcje//

END jakaś_procedura;

W procedurach 1, 2 oraz 3 nie ma obsługi wyjątków. Czy w przypadku wystąpienia błędu wewnątrz którejś z nich wyjątek zostanie obsłużony wewnątrz "jakaś_procedura" która je uruchamia?

0

rollback/commit odnosi się do aktualnej transakcji i ją zatwierdza lub wycofuje. Transakcja (niejawna) rozpoczyna się w momencie połączenia z bazą, po każdym commit/rollback jest "resetowana", można też jawnie rozpocząć transakcję. W tym wypadku, jeśli proceduran nie ma w środku commita to zostanie wycofana całość zmian wprowadzonych przez te trzy procedury, transakcja zostanie "zresetowana" i dalej będzie wykonywane //...pozostałe instrukcje//.

Edit: żeby była jasność blok BEGIN END nie ma żadnego wpływu na "zasięg" transakcji

1 użytkowników online, w tym zalogowanych: 0, gości: 1