2011-02-08 4 views
2

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

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

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

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

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

DEBUG - TX Требуется: Начало транзакции [email protected]

.... вещи , в конце концов трассировки стека я входе ....

DEBUG - TX Требуется: setRollbackOnly() по сделке org.apache.[email protected]
DEBUG - TX Требуется: Откат транзакции [email protected]

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

ответ

3

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

+0

Это точно моя проблема. Спасибо! Для тех, кто хочет услышать это от уст лошади: http://forums.mysql.com/read.php?21,68686,68686 – lakemalcom

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