事务未在方法结束时提交

Transaction not committed at end of method

我有两个用事务注释的方法(它们在同一级别 - 具有相同的父事务,如下所示):

@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。

之所以会发生这种情况,是因为 RuntimeExceptionpersistEntities1() 的执行过程中被抛出。

参见why does transaction roll back on RuntimeException but not SQLException

异常是否被捕获和处理似乎并不重要,事务上下文仍然设置为"rollback only"。

解决方案是移动方法 persistEntities1persistEntities2 来分离 bean。现在行为符合预期。

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