spring try-catch捕获异常信息后事务控制失效解决方案
一、首先在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;