Zaawansowane opcje PL/SQL

Transakcje a bloki PL/SQL

Transakcje są całkowicie niezależne od podziału kodu PL/SQL na bloki. Ani cała transakcja nie musi się zawierać w jednym bloku, ani też jeden blok nie musi się zawierać w jednej transakcji. Możliwe są wszelkie kombinacje.

Polecenie COMMIT lub ROLLBACK wydane w bloku PL/SQL mają wpływ nie tylko na dane zmodyfikowane w tymże bloku, ale na wszystkie dane zmodyfikowane w całej transakcji, niezależnie od tego, w jakim bloku ta transakcja została rozpoczęta, dlatego nie zaleca się wstawiania w procedurach instrukcji sterujących transakcjami.

Przykład


BEGIN
  DELETE FROM ...
  procedura1;
  INSERT INTO ...
  UPDATE ...
  ROLLBACK;
END;
                        

Jeżeli w powyższym przykładzie w kodzie procedury procedura1 znalazłoby się polecenie COMMIT, to instrukcja ROLLBACK spowoduje tylko wycofanie modyfikacji danych spowodowanych przez instrukcje INSERT i UPDATE, natomiast działania instrukcji DELETE nie można będzie już cofnąć.

Transakcje autonomiczne

Wszystkie operacje SQL odbywają się w kontekście pewnych transakcji, które muszą zostać albo w całości zatwierdzone lub w całości wycofane. Przed 8i nie było możliwości, aby pewne operacje zostały zatwierdzone lub wycofane niezależnie od innych operacji w tej samej transakcji. W Oracle 8i można tego dokonać dzięki transakcjom autonomicznym.

zewnętrzną, ale jest całkowicie od niej niezależna.

Pragma AUTONOMOUS_TRANSACTION

Jedynym sposobem, aby wykonać pewne instrukcje w transakcji autonomicznej jest umieszczenie ich w jednym bloku PL/SQL i zaznaczenie tego bloku jako autonomicznego poprzez wprowadzenie w sekcji deklaracyjnej pragmy AUTONOMOUS_TRANSACTION.

Pragma ta może wystąpić w dowolnym miejscu sekcji deklaracyjnej, ale dobrym zwyczajem jest umieszczanie jej na samym początku.

Nie wszystkie bloki PL/SQL mogą być przekształcone w bloki autonomiczne. Tylko następujące typy mogą zawierać pragmę autonomiczności:

  • najbardziej zewnętrzne bloki anonimowe i etykietowane,
  • procedury i funkcje lokalne, samodzielne i w pakietach,
  • wyzwalacze.

Właściwości transakcji autonomicznych

Transakcja autonomiczna rozpoczyna się od pierwszej instrukcji w bloku autonomicznym i kończy w sposób identyczny jak zwykłe transakcje.

Wszystkie polecenia do sterowanie transakcjami: COMMIT. ROLLBACK, SAVEPOINT, SET TRANSACTION mogą być używane w transakcjach autonomicznych. Savepointy są lokalne w transakcji autonomicznej i nie można wycofać operacji z transakcji autonomicznej do punktu zachowania w transakcji zewnętrznej i również nie można wycofać poleceń z transakcji zewnętrznej do punktu zachowania umieszczonego w transakcji autonomicznej.

Transakcje autonomiczne nie kończą się automatycznie wraz z wyjściem z bloku autonomicznego. Jeżeli sterowanie opuści blok autonomiczny bez zakończenia transakcji, to generowany jest błąd ORA-6519 i cała transakcja autonomiczna jest wycofywana.

Ponieważ transakcja autonomiczna i transakcja zewnętrzna są niezależne, to również blokują sobie nawzajem zasoby, tak jakby były to dwie rywalizujące ze sobą transakcje wykonujące się równolegle w dwu sesjach.

Przykład


-- Poprawny blok autonomiczny
DECLARE
  PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
  INSERT INTO ...
  COMMIT;
END;
/

-- Niepoprawny blok autonomiczny
DECLARE
  v_1 number;
  PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
  INSERT INTO ...
  COMMIT;
  v_1 := 10;
END;
/

-- Niepoprawny blok autonomiczny
CREATE OR REPLACE PROCEDURE procedura1
IS
  v_1 number;
BEGIN
  ...
  v_1 := 10;
  DELETE FROM tabela1 ...
  DECLARE
    PRAGMA AUTONOMOUS_TRANSACTION;
  BEGIN
    INSERT INTO tabela2...
    COMMIT;
  END;
  v_1 := 10;
  ...
END;
/