Wycofanie transakcji EJB3

Używam CMT w sesjach bez stanu EJB3. Stworzyłem również własny wyjątek z adnotacją " @ ApplicationException (rollback=true)".

  1. Czy muszę używać " kontekstu.setRollbackOnly () " kiedy chcę wycofać transakcję?

  2. Czy mogę po prostu cofnąć transakcję, rzucając wyjątek wewnątrz metody publicznej w fasoli?

  3. 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. ;)

Author: ruwan.jayaweera, 2010-03-02

2 answers

Po pierwsze, nie ma wycofania wyjątku, jest to wycofanie transakcji.

  1. 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.
  2. zaznaczony wyjątek nie wycofuje transakcji. Musi mieć adnotację @ApplicationException(rollback=true). Jeśli wyjątek jest RuntimeException i wyjątek nie zostanie złapany, wymusza to wycofanie kontenera transakcja. Ale uważaj, kontener w tym przypadku odrzuci instancję EJB.
  3. 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 .

 66
Author: Steve,
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.)

 0
Author: Christian Gosch,
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