Inspiracja , wiedza , realizacja
Jsystems

W przebudowie

Login



Java

Oracle

Linux

Android

PostgreSQL

Microsoft SQL Server

Transakcje autonomiczne

Data dodania: Jun 20, 2016
Data aktualizacji: Jun 20, 2016

Bywają sytuacje kiedy chcę uniezależnić jedną transakcję od innej. Wytłumaczę to na przykładzie. Przypuśćmy że chcę założyć wyzwalacz który będzie wstawiał do tabelki z logami informację kiedy ktoś wykona update na tabelce employees. Najpierw tworzę tą tabelkę, sekwencja też się przyda:




Tworzę wyzwalacz:




Ok, sprawdźmy czy działa:




Działa. Niby. Jednak kiedy transakcja która wywołała wyzwalacz zostanie wycofana, również zniknie mój wpis z logów:




Nie dobrze... Intuicyjnie dodaję więc commit:




Ale przy próbie update dostaję taki komunikat. Hmmm... dzieje się tak ponieważ operacje w wyzwalaczu związane są z tą samą transakcją która uruchomiła wyzwalacz. Dlatego nie mogę w wyzwalaczu zastosować commit, ponieważ wpłynęłoby to na operację wywołującą a tego mi robić nie wolno. Jest za to możliwość uniezależnienia operacji dodającej wiersz do logów od operacji wywołującej. Wystarczy dodać w sekcji declare „pragma autonomous_transaction”. To sprawi że te dwie operacje będą objęte dwoma niezależnymi transakcjami. Po tej drobnej kosmetyce i przekompilowaniu wyzwalacza, widzimy że mimo wycofania operacji wywołującej dane w logach pozostają.