Glassfish:JTA/JPA交易未回滚
我正在使用Oracle数据库运行Glassfish 3.1.1,遇到了一个事务无法回滚的问题,但到目前为止只在一个特定的环境中运行。同样的应用程序在其他机器上也能正常工作。但是,同一台机器上的两个单独的Glassfish域会受到影响 在受影响的环境中,我对EJB中抛出RuntimeException的容器管理事务(CMT)和带有Glassfish:JTA/JPA交易未回滚,jpa,ejb,glassfish-3,jta,bean-managed-transactions,Jpa,Ejb,Glassfish 3,Jta,Bean Managed Transactions,我正在使用Oracle数据库运行Glassfish 3.1.1,遇到了一个事务无法回滚的问题,但到目前为止只在一个特定的环境中运行。同样的应用程序在其他机器上也能正常工作。但是,同一台机器上的两个单独的Glassfish域会受到影响 在受影响的环境中,我对EJB中抛出RuntimeException的容器管理事务(CMT)和带有UserTransaction\rollback()的bean管理事务(BMT)都有类似的结果 在这两种情况下,潜在的问题似乎是JDBC连接仍然以某种方式设置为autoC
UserTransaction\rollback()的bean管理事务(BMT)都有类似的结果
在这两种情况下,潜在的问题似乎是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");
}
}
public void rollbackUtxTest() throws Exception {
utx.begin();
Foo foo = new Foo();
entityManager.persist(foo);
entityManager.flush();
utx.rollback();
}
我的BMT/UserTransaction测试如下:
@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");
}
}
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是正确的。看起来这可能是domain.xml的问题,可能是Glassfish的错误
在persistence.xml中,我有
jdbc/TEST
在domain.xml中,我有
<jdbc-resource pool-name="TEST_POOL" description="" jndi-name="jdbc/TEST"></jdbc-resource>
但没有相应的
——要么缺失,要么拼错。(我相信我最终是通过UI创建JNDI数据源,意识到名称是错误的,然后手动修复domain.xmljdbc resource
中的JNDI名称,但没有在resource ref
中修复它,从而达到了这种状态
在这种情况下,我的注入式EntityManager仍然可以工作,但不参与JTA事务。如果我修复了domain.xml,它将按预期工作。您没有将异常包装在EJBException中
请参见请包含您的persistence.xml和datasource def以及您正在使用的任何自定义程序。我想我已经找到了答案…请参见下面的答案。我遇到了相同的情况。令人难以置信的是,服务器启动了,我在GUI中没有看到任何差异,事务只是设置为自动提交模式--非常感谢您提出了这个问题,我不会这么做的请永远告诉我,如果有人发现这一点很有帮助,我会感到非常高兴。令人不安的是,这个问题仍然存在,而且在Glassfish 4.0中也没有得到解决。我在一个嵌入式Glassfish容器中遇到了这个问题,一直在到处寻找解决方案。结果发现我的test-domain.xml缺少该元素。谢谢!