JavaEE7回滚事务
我知道未经检查的异常(RuntimeExceptions)通常会导致事务回滚,但如果用相同的方法捕获该异常,会发生什么情况?我希望在JavaEE7回滚事务,java,jakarta-ee,transactions,Java,Jakarta Ee,Transactions,我知道未经检查的异常(RuntimeExceptions)通常会导致事务回滚,但如果用相同的方法捕获该异常,会发生什么情况?我希望在error发生时回滚整个事务为true。但我想知道捕获异常是否会吞噬RuntimeException,从而导致事务不回滚?此代码是否仍回滚事务 public static void main(String[] args) { try { // boring stuff... if(errorOccurred) thro
error发生时回滚整个事务
为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容器的角度来看,这是正常的程序执行,所以它不会回滚事务
如果希望捕获运行时异常并回滚事务,则需要以编程方式回滚这些特定运行时异常上的事务。在会话bean中,它提供了sessioncontext对象,该对象具有方法setRollbackOnly,使用该方法,您可以通知容器回滚事务,而不会引发运行时异常。消息驱动bean还提供了messagedrivencontext对象,可用于回滚事务[检查MDB如果您传递到
手动
异常处理,您应该自己回滚。那么您为什么要捕获异常?@JackFlamp此方法中还有一些其他事情需要处理已检查的异常。否则我会将其清除。然后您应该独立处理这些异常运行时异常被定义为导致rollback@JackFlamp我想知道的是,如果回滚在抛出RuntimeException时立即启动,或者它会等到catch/finally块首先运行吗?