Отладка транзакций в Java EE - PullRequest
       43

Отладка транзакций в Java EE

2 голосов
/ 26 октября 2010

У меня есть метод @Stateless EJB, в котором я

  1. удалить некоторые записи из базы данных используя JPA remove() s
  2. сгенерировать исключение, аннотированное как @ApplicationException(rollback=true)

У меня нет других специфичных для транзакции аннотаций для метода (я установил @TransactionAttribute(TransactionAttributeType.REQUIRED), но это все равно должно быть по умолчанию!). Транзакции управляются контейнером. JPA-провайдером является EclipseLink.

И все же транзакция не откатывается при возникновении исключения. Например. Записи, которые я удалил из базы данных до отката, не возвращаются. Btw. Я вызываю entityManager.flush () перед броском, может ли это вызвать такое поведение (не должно)?

Я также пытался позвонить SessionContext.setRollbackOnly(), с тем же результатом.

Как я могу отладить эту проблему?

Я использую Glassfish v3 и Netbeans для отладки, но я был бы одинаково счастлив с println, просто не знаю, где их поставить ...

Ответы [ 2 ]

2 голосов
/ 28 октября 2010

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

  • Вы создали EntityManager с помощью EntityManagerFactory
  • Вы указали transaction-type="RESOURCE_LOCAL" в своем файле persistence.xml

Дополнительные вещи для проверки:

  • <jta-data-source> заполняется в файле persistence.xml
  • Источник данных, на который ссылается <jta-data-source>, настроен для участия в транзакциях JTA (автоматическая фиксация отключена)

Эти два последнихв некоторой степени зависят от поставщика, так как некоторые поставщики автоматически заполняют <jta-data-source>, если он не указан.Также некоторые могут потерпеть неудачу при развертывании, если <jta-data-source> указывает на источник данных, который не настроен для участия в транзакциях JTA (эта настройка зависит от поставщика).Не уверен, как Glassfish обращается с этими двумя предметами.

2 голосов
/ 26 октября 2010

У меня есть метод @Stateless EJB, в котором я (...)

Просто чтобы уточнить, как вы получаете EntityManager?

(...) Я установил @TransactionAttribute (TransactionAttributeType.REQUIRED

Действительно, это значение по умолчанию и не должно требоваться в любом случае.

И все же, транзакцияне откатывается при возникновении исключения. Например, записи, которые я удалил из базы данных до отката, не возвращаются.

Хм, это очень странно и неожиданно.

Кстати, я вызываю entityManager.flush () перед броском, может ли это вызвать такое поведение (не должно)?

Нет, flush! = Commit

Я также пытался вызвать SessionContext.setRollbackOnly (), с тем же результатом.

Ну, все же неожиданно (но по крайней мере непротиворечиво ...).

Я использую Glassfish v3 и Netbeans для отладки

Возможно, активируйте ведение журнала следующих категорийories (например, через консоль администратора в разделе «Конфигурация»> «Ведение журнала»> «Уровни журнала»), чтобы узнать, можно ли обнаружить что-то странное:

  • javax.enterprise.system.core.transaction
  • javaxenterprise.resource.jta
  • javax.enterprise.system.container.ejb

В качестве альтернативы (своего рода «ведение журнала бедняков»), вы можете реализовать SessionSynchronization, чтобы получить уведомление о транзакции.

Действительно странная проблема ...

См. Также

...