Glassfish: транзакция JTA / JPA не откатывается - PullRequest
1 голос
/ 06 января 2012

Я использую Glassfish 3.1.1 с базой данных Oracle и столкнулся с проблемой, когда транзакции не откатываются, а пока только в одной конкретной среде. То же приложение работает, как и ожидалось, на других машинах. Однако это влияет на два отдельных домена Glassfish на одном компьютере.

В уязвимой среде у меня есть похожие результаты как с транзакциями, управляемыми контейнером (CMT) внутри EJB, который генерирует исключение RuntimeException, так и с транзакцией, управляемой бином (BMT) с UserTransaction#rollback().

В обоих случаях основная проблема заключается в том, что JDBC-соединение каким-то образом все еще установлено с autoCommit = true, даже если выполняется транзакция JTA.

Мой тест EJB / CMT выглядит так:

@Named
@Stateless
public class TransactionTest { 

  @PersistenceContext
  EntityManager entityManager;

  @TransactionAttribute(TransactionAttributeType.REQUIRED)
  public void rollbackTest() {
    Foo foo = new Foo();
    entityManager.persist(foo);
    entityManager.flush();

    throw new RuntimeException("should be rolled back");
  }
}

и мой тест BMT / UserTransaction выглядит так:

public void rollbackUtxTest() throws Exception {
    utx.begin();

    Foo foo = new Foo();
    entityManager.persist(foo);
    entityManager.flush();

    utx.rollback();   
}

Когда я вызываю любой из этих методов, INSERT INTO FOO фиксируется, даже если транзакции откатывались.

Чего мне не хватает - возможно, у меня нет пула соединений / источник данных не настроен правильно?

Я использую OracleConnectionPoolDataSource в качестве имени класса источника данных. Что мне нужно сделать, чтобы подключения к моей базе данных участвовали в транзакциях JTA?

ОБНОВЛЕНИЕ 1 Первоначально я думал, что это проблема с OracleConnectionPoolDataSource, но оказалось, что это не коррелирует. Та же самая конфигурация пула работает в одной среде, но не в другой.

ОБНОВЛЕНИЕ 2 Уточнено, что это не проблема EJB / CMT, а общая проблема JTA.

ОБНОВЛЕНИЕ 3 добавлена ​​информация об автокоммите JDBC. Подтвердил, что файл persistence.xml правильный.

Ответы [ 2 ]

3 голосов
/ 10 января 2012

Похоже, что это может быть проблема с domain.xml, возможно, ошибка Glassfish.

В файле persistence.xml у меня есть

<jta-data-source>jdbc/TEST</jta-data-source>.

В домене .xml у меня есть

<jdbc-resource pool-name="TEST_POOL" description="" jndi-name="jdbc/TEST"></jdbc-resource>

Но нет соответствующего <resource-ref ref="jdbc/TEST"> - либо отсутствует, либо написано с ошибкой. (Я полагаю, что оказался в этом состоянии, создав источник данных JNDI через пользовательский интерфейс, осознав, что имя неверно, а затем исправив имя JNDI в domain.xml jdbc-resource вручную, но не исправив его в resource-ref.

В этом случае мой введенный EntityManager по-прежнему работает, но не участвует в транзакциях JTA. Если я исправлю domain.xml, он будет работать как положено.

0 голосов
/ 04 февраля 2012

Вы не поместили свое исключение в исключение EJB.

См. http://docs.oracle.com/javaee/6/tutorial/doc/bnbpj.html

...