Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Glassfish:JTA/JPA交易未回滚_Jpa_Ejb_Glassfish 3_Jta_Bean Managed Transactions - Fatal编程技术网

Glassfish:JTA/JPA交易未回滚

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

我正在使用Oracle数据库运行Glassfish 3.1.1,遇到了一个事务无法回滚的问题,但到目前为止只在一个特定的环境中运行。同样的应用程序在其他机器上也能正常工作。但是,同一台机器上的两个单独的Glassfish域会受到影响

在受影响的环境中,我对EJB中抛出RuntimeException的容器管理事务(CMT)和带有
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.xml
jdbc resource
中的JNDI名称,但没有在
resource ref
中修复它,从而达到了这种状态


在这种情况下,我的注入式
EntityManager仍然可以工作,但不参与JTA事务。如果我修复了domain.xml,它将按预期工作。

您没有将异常包装在EJBException中


请参见

请包含您的persistence.xml和datasource def以及您正在使用的任何自定义程序。我想我已经找到了答案…请参见下面的答案。我遇到了相同的情况。令人难以置信的是,服务器启动了,我在GUI中没有看到任何差异,事务只是设置为自动提交模式--非常感谢您提出了这个问题,我不会这么做的请永远告诉我,如果有人发现这一点很有帮助,我会感到非常高兴。令人不安的是,这个问题仍然存在,而且在Glassfish 4.0中也没有得到解决。我在一个嵌入式Glassfish容器中遇到了这个问题,一直在到处寻找解决方案。结果发现我的test-domain.xml缺少该元素。谢谢!