我正在使用 Oracle 数据库运行 Glassfish 3.1.1,并且遇到了事务不回滚的问题,但到目前为止仅在一个特定环境中。相同的应用程序在其他机器上按预期工作。但是,同一台机器上的两个单独的 Glassfish 域会受到影响。
在受影响的环境中,我在 EJB 中的容器管理事务 (CMT) 和抛出 RuntimeException 的容器管理事务 (CMT) 和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 问题。
UPDATE 3添加了有关 JDBC 自动提交的信息。确认persistence.xml 是正确的。