【发布时间】:2020-03-24 14:17:38
【问题描述】:
我遇到了标记为 @ApplicationException(rollback=true) 的捕获的 RuntimeException 的问题,它回滚了我的数据库事务并终止了该事务以执行以下操作。
@ApplicationException(rollback = true)
public class XyzValidationException extends RuntimeException {
...
}
该过程是批量导入过程,即批量导入海量数据。当事务回滚时,整个块被回滚,然后再次选择导入,所以整个事情在一个无限循环中重复。
应用服务器是 JBoss 7.1,数据库是 Oracle 11.2。
我想捕获异常,将导入源实体标记为错误,记录一些内容,然后继续处理其余数据。
但捕获异常并不能阻止事务回滚。我现在已经阅读并理解这种行为是正常的。 但问题是,那你怎么做呢?你如何配置异常在它被捕获时不回滚,并且在它未被捕获时仍然进行回滚? 我可以将异常的注释设置为@ApplicationException(rollback=false),但是我会阻止在抛出异常但未被捕获的情况下回滚,对吧? 在其他进程中,当抛出此异常时,回滚可能是明智的。在那里,我只是不想赶上ist。 有谁知道,我怎么能做到这一点?
我已经尝试将异常更改为已检查异常(... extends Exception),并将注释保留为 rollback=true。 它并没有改变行为(我在想/希望 rollback=true 可能只会对未捕获的异常生效,并在我的情况下做到这一点......但没有) 然后我用 rollback=false 尝试了检查异常,正如预期的那样,它成功了。但如前所述,我不想完全停用回滚......只有在捕获到异常时。 而且,如果可能的话,我想坚持 RuntimeException,因为我们有这个“策略”来尽可能使用 RuntimeExceptions,并且必要的 throws-declarations 将遍布整个应用程序......
提前谢谢...
弗兰克
【问题讨论】:
-
当 EJB 抛出系统异常或应用程序异常且回滚设置为 true 时,无论是否捕获到异常,总是回滚事务,因为捕获(或未捕获)异常的客户端是超出交易范围。 EJB 的行为不能依赖于客户端捕获或不捕获异常的位置。要更改行为,您需要在 ejb 方法内或使用拦截器进行此操作
-
感谢@areus 的评论...您写道“要更改您需要在 ejb 方法中执行的行为...”-您的意思是在相同的方法中捕获它扔了?
-
是的。但是如果你不能修改 ejb 方法的代码,你可以应用一个拦截器
标签: exception transactions ejb rollback java-ee-7