事务未在方法结束时提交
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。
之所以会发生这种情况,是因为 RuntimeException
在 persistEntities1()
的执行过程中被抛出。
参见why does transaction roll back on RuntimeException but not SQLException。
异常是否被捕获和处理似乎并不重要,事务上下文仍然设置为"rollback only"。
解决方案是移动方法 persistEntities1
和 persistEntities2
来分离 bean。现在行为符合预期。
如果子方法与父方法位于同一个 bean 中,这个特定的 jpa 实现似乎忽略了子事务注释。
我有两个用事务注释的方法(它们在同一级别 - 具有相同的父事务,如下所示):
@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。
之所以会发生这种情况,是因为 RuntimeException
在 persistEntities1()
的执行过程中被抛出。
参见why does transaction roll back on RuntimeException but not SQLException。
异常是否被捕获和处理似乎并不重要,事务上下文仍然设置为"rollback only"。
解决方案是移动方法 persistEntities1
和 persistEntities2
来分离 bean。现在行为符合预期。
如果子方法与父方法位于同一个 bean 中,这个特定的 jpa 实现似乎忽略了子事务注释。