2010-03-02 3 views
27

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

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

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

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

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

ответ

62

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

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

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

+0

«Если вы поймали проверенное исключение внутри кода, вы должны использовать setRollbackOnly для отката транзакции». Можете ли вы также бросить ту же исключение и отменить транзакцию? –

+0

Вы можете исключить одно и то же исключение из предложения throws, но транзакция не возвращается. Если вы хотите отменить транзакцию в этом случае, вы должны добавить исключение @ApplicationException (rollback = true) к своему исключению. Другой способ заключается в том, чтобы обернуть проверенное исключение из неконтролируемого исключения (например, RuntimeException). Но этот способ не является действительно предпочтительным, потому что, если выбрано RuntimeException, контейнер отбрасывает экземпляр bean и создает новый. – Steve

+1

Я просто смотрел на этот ответ по тем же причинам и хочу указать, что книга, на которую вы ссылаетесь, больше не предлагается полностью на этом сайте, и это с 2006 года, поэтому она ужасно устарела и, вероятно, не очень удобна в JEE5 и контексты JEE6. – BillR

0

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

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

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

  • Нет связанных вопросов^_^