EJB 3 CMT Как откатить первую транзакцию без отката суб-транзакций? - PullRequest
2 голосов
/ 21 марта 2012

Я использую приложение с транзакциями EJB и CMT.У меня есть EJB (давайте назовем его EJB1) с CMT, определяемым как «require_new» аннотацией, например:

@TransactionAttribute(TransactionAttributeType.REQUIRED)

Поскольку транзакции до сих пор не существует, она ее создает.Теперь этот EJB1 вызывает другой EJB (EJB2).Все, что я нашел в своих исследованиях, - это уникальный способ создания другой транзакции, использующий «require_new», например:

@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)

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

То, что мне нужно, похоже, только вот это отличие: когда EJB1 не работает, он должен быть откат, но я хочу, чтобы EJB2 все ещесовершено, если это не терпит неудачу.

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

Ответы [ 2 ]

1 голос
/ 21 марта 2012

Упомянутые вами транзакционные атрибуты должны работать так, как вы ожидаете в своем сценарии; если вызов EJB2 завершится успешно, он будет зафиксирован самостоятельно, так как он требует require_new. В этом случае, однако, если необработанное исключение появляется перед этим вызовом EJB2, оно может даже не быть вызвано, создавая впечатление, что все откатывается.

Если это не так, вы также можете управлять транзакцией в EJB1, вставляя EJBContext и вызывая context.setRollbackOnly (). Это пометит текущую транзакцию как отмененную после ее завершения, и она будет работать так, как вы ожидаете.

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

Я не могу подтвердить ваше заявление:

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

У меня был метод EJB1 без каких-либо аннотаций (по умолчанию, наверное, REQUIRED) и EJB2метод с аннотацией @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW).

EJB1 вызывал EJB2.В EJB2 я сохранил сущность и оставил метод.Вернувшись в EJB1, я вызвал откат, вызвав исключение. В конце концов, изменение EJB2 сохранилось, хотя EJB1, безусловно, был откатан.

Кроме того, после того, как EJB2 был оставлен, вы уже могли видеть зафиксированное изменение в базе данных (приостановив EJB1выполнение с точкой останова).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...