EJB: избегать отката транзакции - PullRequest
18 голосов
/ 13 декабря 2011

Когда (транзакционный) метод EJB вызывает другой (транзакционный) метод другого EJB, и исключение выдается во втором, но перехватывается в первом, создается впечатление, что транзакция автоматически откатывается, когда второй возвращается, даже если первый ловит его, это правда? как я могу избежать этого?

Сценарий следующий:

@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() }
}

Ответы [ 2 ]

23 голосов
/ 13 декабря 2011

Транзакция откатывается в случае, если вы выбросили RuntimeException или любое исключение, у которого аннотация @ApplicationException с атрибутом rollback установлена ​​в true, поэтому:

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

откатит текущийтранзакция.

По умолчанию ApplicationException не выполняет откат вашей транзакции.

Если вы не хотите, чтобы methodB откатывал вашу транзакцию, вы можете либо изменить поведение отката вашей ApplicationException, либо запретитьсовместное использование транзакций.

Последнее достигается путем изменения TransactionAttribute метода B, т. е. на RequiresNew.Тогда транзакция methodA (Tx1) будет приостановлена, и в случае, если methodB генерирует исключение, которое приводит к откату его транзакции (Tx2), вы все равно можете перехватить его в methodA и предотвратить откат вашей транзакции methodA (Tx1).

9 голосов
/ 13 декабря 2011

Да, это правда, если исключение является исключением во время выполнения. Проверенные исключения не вызывают откат транзакции.

Чтобы избежать этого, просто убедитесь, что код в methodB не выдает никаких исключений времени выполнения. Исключение времени выполнения обычно указывает на ошибку или состояние, которое не позволяет продолжить работу.

...