Отладка транзакций в Java EE
-
26-09-2019 - |
Вопрос
У меня есть метод EJB @Stouless, в котором я
- Удалите несколько записей из базы данных с помощью JPA
remove()
С. - бросить исключение, которое аннотировано как
@ApplicationException(rollback=true)
У меня нет других конкретных аннотаций с транзакциями для метода (я установил @TransactionAttribute(TransactionAttributeType.REQUIRED)
Но это должно быть по умолчанию в любом случае!). Снареженные транзакции управляются контейнера. JPA поставщик EclipseLink.
И все же транзакция не откатывается, когда исключение брошено. Например. Записи, которые я удалял из базы данных до отката, не вернется. Кстати. Я звоню EntityManager .flush () До броска, может ли он вызывать такое поведение (не должно)?
Я также пытался позвонить SessionContext.setRollbackOnly()
, с тем же результатом.
Как я могу отладить эту проблему?
Я использую GlassFish V3 и NetBeans для отладки, но я был бы одинаково рад с PrintLn, я просто не знаю, где их поставить ...
Решение
У меня есть метод EJB @Stouless, в котором я (...)
Просто чтобы уточнить, как вы получаете EntityManager?
(...) Я устанавливаю @transactaTttribute (транзацияattributeType.required
Действительно, это значение по умолчанию и в любом случае не должно потребоваться.
И все же транзакция не откатывается, когда исключение брошено. Например. Записи, которые я удалял из базы данных до отката, не вернется.
Хм, это очень странно и неожиданно.
Кстати. Я звоню EntityManager .flush () До броска, может ли он вызывать такое поведение (не должно)?
Нет, Flush! = Commun
Я также пытался вызвать SessionContext.Setrollbackonly (), с тем же результатом.
Ну, все еще неожиданно (но, по крайней мере, последовательно ...).
Я использую Glassfish V3 и NetBeans для отладки
Может быть, активируйте ведение журнала следующих категорий (например, через консоль администратора в разделе «Конфигурация> Регистрация> Уровни журнала), чтобы увидеть, если вы можете обнаружить что-то странное:
- javax.enterprise.system.core.transaction.
- javax.enterprise.resource.jta.
- javax.enterprise.system.container.ejb.
В качестве альтернативы (вроде «лесозаготовка бедного человека») вы могли бы реализовать SessionSynchronization
Чтобы получить уведомление о транзакции.
Действительно странная проблема ...
Смотрите также
Другие советы
В дополнение к хорошему ответу Паскаля, некоторые вещи, чтобы проверить ... ваш EntityManager
гарантируется нет Для участия в контейнерных транзакциях, если какое-либо из следующих действий:
- Вы создали EntityManager через EntityManagerFactory
- Вы указали
transaction-type="RESOURCE_LOCAL"
В вашем сохранении .xml.
Вторичные вещи, чтобы проверить:
<jta-data-source>
заполняется в сохранении .xml- DataSource ссылается через
<jta-data-source>
Настройка для участия в JTA транзакции (автоматическое коммиссия выключено)
Эти последние два являются несколько поставщиком, особенно в том, что некоторые поставщики автоматически заполнят <jta-data-source>
Если это не указано. Также некоторые не пройдут развертывание, если <jta-data-source>
Указывает на источник данных, который не установлен для участия в JTA транзакциях (эта настройка является специфичной поставщиком). Не уверены, как Glassfish обрабатывает эти два предмета.