2012-01-06 111 views
0

我正在Glassfish 3.1.1上运行Oracle数据库,并且遇到了无法回滚的交易问题,但仅限于目前的特定环境。相同的应用程序在其他机器上按预期工作。但是,同一台机器上的两个独立的Glassfish域会受到影响。Glassfish:JTA/JPA交易未回滚

在受影响的环境中,我在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"); 
    } 
} 

和我的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事务?

UPDATE 1我原本以为这是OracleConnectionPoolDataSource的问题,但事实证明它并不相关。同一个确切的池配置适用于一个环境,但不适用于其他环境。

UPDATE 2澄清,这不是一个具体的EJB/CMT问题,而是一个普遍的JTA问题。

UPDATE 3添加了有关JDBC自动提交的信息。确认persistence.xml是正确的。

+0

请附上您的persistence.xml和数据源的def您使用 – James 2012-01-10 14:34:49

+0

确定任何定制,我想我想通了......见下文 – wrschneider 2012-01-10 19:26:46

+0

答案http://java.net/jira/浏览/ GLASSFISH-18166 – wrschneider 2012-01-10 19:55:32

回答

3

看起来这可能是domain.xml的一个问题,可能是一个Glassfish错误。

persistence.xml中,我有

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

domain.xml中,我有

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

但没有相应的<resource-ref ref="jdbc/TEST"> - 丢失或拼写错误。 (我相信我在该状态下结束了通过用户界面中创建的JNDI数据源,实现了名称错误,然后用手domain.xml中jdbc-resource固定JNDI名称,但不是在resource-ref固定。

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

+0

https://java.net/jira/browse/GLASSFISH-18166 – wrschneider 2013-07-08 17:43:26

+0

同样发生在我身上。它令人难以置信的服务器启动,我看到没有区别的GUI和交易只是设置为自动提交模式-.- 非常感谢提出这个问题,会让我永远找不到,否则^^ – icyerasor 2015-11-09 16:11:10

+1

很高兴有人发现这有帮助。令人不安的是,这个问题仍然存在,Glassfish 4.0也没有解决。 – wrschneider 2015-11-09 16:13:26