Wycofanie transakcji EJB3
Używam CMT w sesjach bez stanu EJB3. Stworzyłem również własny wyjątek z adnotacją " @ ApplicationException (rollback=true)".
Czy muszę używać " kontekstu.setRollbackOnly () " kiedy chcę wycofać transakcję?
Czy mogę po prostu cofnąć transakcję, rzucając wyjątek wewnątrz metody publicznej w fasoli?
Jeśli tak (odpowiedź na pytanie nr 2 brzmi TAK) Czy muszę wyrzucić wyjątek z metody deklarując wyjątek w metodzie czy wystarczy po prostu wrzucić wyjątek do metody i obsłużyć go wewnątrz samej metody? (Nie chcę propagować wyjątku do następnego poziomu. Chcę tylko cofnąć wyjątek.)
Z góry dzięki. ;)
2 answers
Po pierwsze, nie ma wycofania wyjątku, jest to wycofanie transakcji.
- jeśli wyrzucisz wyjątek za pomocą
@ApplicationException(rollback=true)
, nie musisz ręcznie wycofywać transakcji.Context.setRollbackOnly()
zmusza kontener do wycofania transakcji, również jeśli nie ma wyjątku. - zaznaczony wyjątek nie wycofuje transakcji. Musi mieć adnotację
@ApplicationException(rollback=true)
. Jeśli wyjątek jestRuntimeException
i wyjątek nie zostanie złapany, wymusza to wycofanie kontenera transakcja. Ale uważaj, kontener w tym przypadku odrzuci instancję EJB. - Jak wspomniano w 2.), jeśli rzucisz
RuntimeException
, transakcja zostanie automatycznie wycofana. Jeśli złapiesz zaznaczony wyjątek w kodzie, musisz użyćsetRollbackOnly
, aby cofnąć transakcję.
Aby uzyskać więcej informacji, zapoznaj się z bezpłatną książką Mastering EJB. Bardzo dobrze opisuje scenariusze wycofywania i jest darmowy do pobrania .
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-11 15:12:28
Nie ma jeszcze odpowiedzi na pytanie, w jaki sposób zapobiec propagacji zaznaczonych wyjątków, które powodują cofanie się rzutów do "górnej warstwy".
Myślę, że będzie to wymagało owijki wokół danego EJB, która połyka wyrzucony wyjątek. (Innymi słowy: myślę, że Niestandardowy wyjątek musi być wyrzucony przeciwko granicy metody (a więc nie przechwytywany i przetwarzany wewnątrz metody) i propagowany, aby uzyskać efekt transakcyjny -- a także spowoduje z kolei zniszczenie instancji EJB.)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-15 13:18:14