交易未在方法结束时提交

时间:2015-01-20 18:04:22

标签: java java-ee jpa jboss wildfly

我有两个用transactional注释的方法(它们在同一级别上 - 具有相同的父事务,如下面草拟的那样):

@javax.transaction.Transactional
persist() {
    persistEntities1()
    persistEntities2()
}

@javax.transaction.Transactional(value = Transactional.TxType.REQUIRES_NEW)
persistEntities1() {}

@javax.transaction.Transactional(value = Transactional.TxType.REQUIRES_NEW)
persistEntities2() {}

persistEntities1 中一​​切正常,EntityManager实例上有一个合并调用。 在 persistEntities2 中有一个未捕获的异常。

问题:应该在 persistEntities1 中保留的实体不会被保留。

为什么会这样?我认为REQUIRES_NEW可以确保在方法结束时提交事务。

我正在使用Wildfly 8.2。

2 个答案:

答案 0 :(得分:1)

解决方案是将方法persistEntities1persistEntities2移动到单独的bean中。现在行为符合预期。

如果子方法与父方法一样存在于同一个bean中,这个特定的jpa实现似乎忽略了子事务注释。

答案 1 :(得分:0)

之所以会发生这种情况,是因为在RuntimeException的执行中抛出了persistEntities1()

请参阅why does transaction roll back on RuntimeException but not SQLException

关于是否已捕获和处理异常似乎无关紧要,事务上下文仍设置为"仅回滚"。