方法名上加注解事务 @Transactional 使用注解的简单模式, 报错会回滚, 但是如果方法中捕获异常后手动抛出异常, 事务并没有回滚.
默认 spring 事务只在发生未被捕获的 RuntimeException 时才回滚.
spring aop 异常捕获原理: 被拦截的方法需显式抛出异常, 并不能经任何处理, 这样 aop 代理才能捕获到方法的异常, 才能进行回滚, 默认情况下 aop 只捕获
RuntimeException 的异常, 但可以通过配置来捕获特定的异常并回滚.
解决方法:
1.
在 catch 中抛出异常时抛出异常类型为 RuntimeException , 经测试 Exception 确实不可以回滚.
2.
如果 catch 中有其他需要不可以抛出 RuntimeException , 可以手动回滚事务:
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
来源: http://www.bubuko.com/infodetail-2972185.html