我正在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