
Strona o szybkim czytaniu.
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.
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ąć.
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.
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:
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.
-- 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;
/