Откат транзакции EJB3 - PullRequest
30 голосов
/ 02 марта 2010

Я использую CMT в сессионных компонентах EJB3 без состояния.Также я создал свое собственное исключение с аннотацией "@ApplicationException (rollback = true)".

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

  2. Можно ли просто откатить транзакцию, выдав исключение внутри public-метода в bean-компоненте?

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

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

Ответы [ 2 ]

68 голосов
/ 02 марта 2010

Во-первых, откат исключения не происходит, это откат транзакции.

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

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

0 голосов
/ 15 мая 2013

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

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

...