我知道,未经检查的异常(RuntimeExceptions)通常会导致事务混乱,但是如果您以相同的方式捕获该异常会怎样?我希望在errorOccurred
为true
时回滚整个事务。但是我不知道捕获Exception是否会吞下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?");
}
}
答案 0 :(得分:2)
如果您的程序捕获到运行时异常,则意味着该异常尚未到达JEE容器,因此从JEE容器的角度来看,这是正常的程序执行,因此不会回滚事务。
如果要捕获运行时异常并回滚事务,则需要以编程方式回滚那些特定的运行时异常的事务。在会话bean中,它提供具有方法setRollbackOnly的sessioncontext对象,使用此方法,您可以通知容器回滚事务,而不会引发运行时异常。消息驱动的Bean还提供了消息驱动的上下文对象,该对象可用于进行事务跟踪[检查MDB https://docs.oracle.com/javaee/6/tutorial/doc/bnbpo.html]