我正在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是正确的。
请附上您的persistence.xml和数据源的def您使用 – James 2012-01-10 14:34:49
确定任何定制,我想我想通了......见下文 – wrschneider 2012-01-10 19:26:46
答案http://java.net/jira/浏览/ GLASSFISH-18166 – wrschneider 2012-01-10 19:55:32