我对spring的事务管理有以下奇怪的情况:
我有方法A,它调用方法B,它调用方法C,每个方法都在不同的类中.方法B和C都包含事务.两者都使用PROPAGATION_required,因此当spring创建两个逻辑事务时,db中有一个物理事务.
现在,在方法C中,我抛出一个RuntimeException.这将内部逻辑事务设置为rollbackOnly和物理事务.在方法B中,我知道UnexpectedRollbackException的可能性,所以我不进行正常提交.我从C中捕获异常,然后抛出另一个RuntimeException.
我希望外部RuntimeException将导致回滚到外部事务,但实际行为是这样的:
>外部事务似乎尝试提交,或者至少检查其状态,然后它抛出UnexpectedRollbackException,因为物理事务已经标记为rollbackOnly.
>在抛出该异常之前,它会向日志打印另一个异常,指出“由提交异常覆盖的应用程序异常”.因此,调用者A接收UnexpectedRollbackException,而不是B抛出的异常.
我找到了一个解决方法,即在抛出异常之前将外部事务主动设置为回滚
public ModelAndView methodB(HttpServletRequest req,HttpServletResponse resp) {
try{
other.methodC();
} catch (RuntimeException e){
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
throw new RuntimeException ("outer exception");
}
return handleGetRequest(req,resp);
}
但是,这种解决方法强烈地将代码与事务api结合在一起,我想避免这种情况.有什么建议?
附:
这两个事务都是为了回滚运行时异常.我没有定义任何rollbackFor异常或类似的东西
Spring的事务管理器最终捕获已检查的异常并尝试提交事务,而不知道methodB抛出的嵌套运行时异常.一旦我发现了这一点,我就设置了事务包装器以回滚已检查的异常,现在它按预期工作.
原文地址:https://www.jb51.cc/spring/431709.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。