我知道未经检查的异常 (RuntimeExceptions) 通常会导致您的事务回滚,但是如果您用相同的方法捕获该异常会怎样?当 errorOccurred
为 true
时,我希望回滚整个事务。但我想知道捕获异常是否会吞下 RuntimeException 从而导致事务不回滚?这段代码还会回滚事务吗?
public static void main(String[] args) {
try {
// boring stuff...
if(errorOccurred)
throw new RuntimeException("RuntimeException is thrown.");
} catch (Exception e) {
System.out.println("RuntimeException cought. Does is still rollback transaction?");
}
}
最佳答案
如果您的程序捕获运行时异常,这意味着异常尚未到达 JEE 容器,因此从 JEE 容器的角度来看,它是正常的程序执行,因此不会回滚事务。
如果您想捕获运行时异常并回滚事务,您需要以编程方式回滚那些特定运行时异常的事务。在session bean中它提供了sessioncontext对象,它有方法setRollbackOnly,通过这个方法你可以通知容器回滚事务而不抛出运行时异常。消息驱动 bean 还提供 messagedrivencontext 对象,可用于回滚事务[检查 MDB https://docs.oracle.com/javaee/6/tutorial/doc/bnbpo.html]
关于Java EE7 回滚事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52363171/