我有两个用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。
答案 0 :(得分:1)
解决方案是将方法persistEntities1
和persistEntities2
移动到单独的bean中。现在行为符合预期。
如果子方法与父方法一样存在于同一个bean中,这个特定的jpa实现似乎忽略了子事务注释。
答案 1 :(得分:0)
之所以会发生这种情况,是因为在RuntimeException
的执行中抛出了persistEntities1()
。
请参阅why does transaction roll back on RuntimeException but not SQLException。
关于是否已捕获和处理异常似乎无关紧要,事务上下文仍设置为"仅回滚"。