spring try-catch捕获异常信息后事务控制失效解决方案

作者: adm 分类: java 发布时间: 2021-08-25

一、首先在Spring Boot项目中,手动添加异常方法进行测试

try{
//出现异常
} catch (Exception e) {
e.printStackTrace();
//设置手动回滚
TransactionAspectSupport.currentTransactionStatus()
.setRollbackOnly();
}
//此时return语句能够执行
return xxx;

try-catch捕获了异常后,这种业务方法也就等于脱离了spring事务的管理,因为没有任何异常会从业务方法中抛出,全被捕获并“吞掉”,导致spring异常抛出触发事务回滚策略失效。

通俗的来说:默认spring事务只在发生未被捕获的 runtimeexcetpion或error时才回滚。

二、处理方案一

spring aop 异常捕获进而回滚。在catch中最后加上throw new runtimeexcetpion(),这样程序异常时才能被aop捕获进而回滚,缺点是无法return异常信息提示,前端用户交互效果不佳

try{
//出现异常
} catch (Exception e) {
e.printStackTrace();
throw new runtimeexcetpion();
}
//此时return语句能够执行
return xxx;

三、处理方案二
就是让一个方法报异常,另一个方法回滚,这样才能真正的触发Spring事务回滚策略。

catch语句中增加:

TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); //手动回滚,这样上层就无需去处理异常了
try{
//出现异常
} catch (Exception e) {
e.printStackTrace();
//设置手动回滚
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
}
//此时return语句能够执行
return xxx;

如果觉得我的文章对您有用,请随意赞赏。您的支持将鼓励我继续创作!