Откат транзакции EJB в спящем режиме - PullRequest
2 голосов
/ 09 февраля 2011

Итак, я использую управляемые контейнером транзакции в OpenEJB и Hibernate, и у меня есть довольно простой сценарий отката транзакций, который я пытаюсь заставить работать. Моя СУБД - MySQL.

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

У меня также есть второй EJB без сохранения состояния, в котором есть аннотация для указанного распространения (но она все еще просто 'обязательна'). Из этого второго EJB-метода я вызываю первый EJB-метод, который выполняет базовые манипуляции / создание сущностей. Я возвращаю сущность, у которой еще нет идентификатора, поэтому я вызвал entityManager.flush (), который дает мне идентификатор для работы с моей сущностью, возвращенной из этого первого EJB.

Вот тут у меня проблема. У этого второго EJB теперь есть проблема, будь то системное исключение или какое-то исключение. Я хотел бы вызвать откат, так что этот EJB имеет член @Resource SessionContext ctx, который я использую для вызова ctx.setRollbackOnly ().

Вот что я вижу в журнале:

DEBUG - Требуется передача: запущена транзакция org.apache.geronimo.transaction.manager.TransactionImpl@540eb4ca

.... прочее, в конечном итоге трассировка стека, я веду журнал ....

DEBUG - TX Обязательно: setRollbackOnly () для транзакции org.apache.geronimo.transaction.manager.TransactionImpl@540eb4ca
DEBUG - TX Требуется: откат транзакции org.apache.geronimo.transaction.manager.TransactionImpl@540eb4ca

Но когда я проверяю базу данных, изменения из первого EJB-файла все еще находятся в базе данных. Чего мне не хватает?

1 Ответ

3 голосов
/ 09 февраля 2011

Возможно, вы используете MyISAM в качестве механизма хранения для вашего стола. Он не поддерживает транзакции, вместо этого используйте InnoDB.

...