2013-12-05 2 views
2

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

ответ

2

Это зависит от того, или нет, исключение составляет исключение приложения (совершить по умолчанию) или системы исключения (Откат всегда). Исключения приложений чаще всего проверяются исключениями, объявленными в предложении throws, но они также могут быть объявлены посредством аннотации @ApplicationException (или соответствующего элемента <application-exception> в ejb-jar.xml).

+0

Итак, если возникает исключение приложения, и я не отмечаю его с помощью @ApplicationException или , то мне нужно отбросить его с помощью setRollBackOnly()? –

+0

@AyanBiswas Да, но позвольте мне переформулировать то, что вы сказали для точности: если возникает исключение приложения, вам необходимо вручную отменить транзакцию с помощью setRollbackOnly; вы можете сделать исключение исключительным случаем приложения (1), добавив его в предложение throws, если метод, (2) аннотирует его '@ ApplicationException' или (3) использует' <приложение-исключение> '. –

1

Если возникшее исключение распространяется на RuntimeException, транзакция откатится. Если он продолжается от Exception (а не является RuntimeException), транзакция будет совершена.

С EJB 3.0, вы можете изменить это поведение с помощью @AnnotationException (или приложения-исключение дескриптора развертывания элемента EJB-jar.xml файла)

Независимо от того, какого класса распространяется исключение, если вы отметили класс с @AnnotationException (rollback = true) транзакция никогда не будет зафиксирована, oposite применяется, если вы отметите исключение с @AnnotationException (rollback = false).

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

Смежные вопросы