2011-12-13 25 views
13

Gdy metoda (transakcyjna) EJB wywołuje inną (transakcyjną) metodę innego EJB, a wyjątek jest zgłaszany w drugim, ale przechwycony w pierwszym, wydaje się, że transakcja jest automatycznie wycofane, gdy drugi powraca, nawet jeśli pierwszy go złapie, czy to prawda? jak mogę tego uniknąć?EJB: Unikanie wycofywania transakcji

Scenariusz jest następujący:

@Stateless 
class ClassA { 
    @EJB 
    ClassB objectB; 

    methodA() { 
     try { 
      objectB.methodB(); 
     } 
     catch(Exception e) { 
      //Here the transaction started in this method is 
      //automatically rolled back. Is this avoidable? 
     } 
    } 
} 

@Stateless 
class ClassB { 
    methodB() throws Exception { throw new Exception() } 
} 

Odpowiedz

19

transakcja zostanie wycofana w przypadku rzucisz RuntimeException lub żadnego wyjątku, które mają @ApplicationException adnotacja z atrybutem rollback ustawiony true, więc:

@ApplicationException(rollback=true) 
public class MyException extends Exception { 
    // ... 
} 

będzie wycofać bieżącej transakcji.

Domyślnie wyjątek ApplicationException nie wycofuje transakcji.

Jeśli nie chcesz, aby metoda B wycofywała transakcję, możesz zmienić zachowanie wycofania na ApplicationException lub uniemożliwić współdzielenie transakcji. To ostatnie jest osiągalne przez zmianę metody B, tj. Na RequiresNew. Następnie transakcja methodA (Tx1) zostanie zawieszona, a w przypadku, gdy metoda B zgłasza wyjątek, który powoduje wycofanie transakcji (Tx2), nadal można go przechwycić w metodzie A i zapobiec wycofaniu transakcji methodA (Tx1).

8

Tak, to prawda, czy wyjątek stanowi wyjątek środowiska wykonawczego. Zaznaczone wyjątki nie powodują wycofania transakcji.

Aby tego uniknąć, po prostu upewnij się, że kod w methodB nie rzuca żadnego wyjątku środowiska wykonawczego. Wyjątek środowiska wykonawczego zwykle oznacza błąd lub stan, który nie pozwala na kontynuowanie pracy.

+0

Moje złe, przepraszam, zmodyfikowałem pytanie, aby zauważyć, że rzuca zaznaczony wyjątek, czy transakcja została wycofana również w tym scenariuszu? – edutesoy

+1

Nie, nie należy go wycofywać, jeśli wyjątek jest zaznaczonym wyjątkiem. –

+1

Jeśli wszystko, co wiesz, że jest zaznaczony wyjątek, nie możesz powiedzieć, czy to będzie, czy nie spowoduje wycofania transakcji. Jeśli jest to '@ApplicationException (rollback = true)' może on przywrócić twoją transakcję. –