Подтвердить что ты не робот

Откат транзакции EJB3

Я использую CMT в сеансе без учета состояния EJB3 beans. Кроме того, я создал собственное Exception с аннотацией "@ApplicationException (rollback = true)".

  • Нужно ли использовать "context.setRollbackOnly()", когда я хочу отменить транзакцию?

  • Могу ли я просто отменить транзакцию, выбросив исключение из общедоступного метода в bean?

  • Если да (ответ на Q # 2 - да), я должен исключить исключение из метода, объявив исключение в методе, или будет достаточно просто выбросить исключение внутри метода и обрабатывать его внутри того же самого метода? (Я не хочу распространять исключение на следующий уровень. Я просто хочу отменить исключение.)

Спасибо заранее.;)

4b9b3361

Ответ 1

Прежде всего, откат отката исключен, это откат транзакции.

  • Если вы выбрали исключение с помощью @ApplicationException(rollback=true), вам не нужно откатывать транзакцию вручную. Context.setRollbackOnly() заставляет контейнер отменить транзакцию, также если нет исключения.
  • Проверенное исключение не отменяет транзакцию. Он должен иметь аннотацию @ApplicationException(rollback=true). Если исключение составляет RuntimeException, и исключение не поймано, это заставляет контейнер откатить транзакцию. Но будьте осторожны, контейнер в этом случае отбросит экземпляр EJB.
  • Как указано в 2.), если вы выбросите RuntimeException, транзакция будет автоматически откат. Если вы поймали проверенное исключение внутри кода, вы должны использовать setRollbackOnly для отката транзакции.

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

Ответ 2

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

Я думаю, что для этого потребуется обертка вокруг рассматриваемого EJB, которая проглатывает исключение. (Другими словами: Я думаю, что пользовательское исключение ДОЛЖНО быть выброшено против границы метода (и, таким образом, не поймано и обработано внутри метода) И распространено для осуществления транзакционного эффекта, а также, в свою очередь, приведет к разрушению экземпляра EJB.)