直接在service 层的方法上加上@Transactional 注解就ok。
注意事项:
1、Spring 基于注解的声明式事物 @Transactional 默认情况下只会对运行期异常(java.lang.RuntimeException及其子类)和 Error 进行回滚。
2、数据库引擎要支持事物,使用InnoDB。
3、@Transactional 只能被应用到public方法上, 对于其它非public的方法,如果标记了@Transactional也不会报错,但方法没有事务功能.
4、看到网上好多人说要在启动类(配置类)上加 @EnableTransactionManagement 来开启事务支持。
经过测试并不需要。
spring aop 异常捕获原理:
被拦截的方法需显式抛出异常,并不能经任何处理,这样aop代理才能捕获到方法的异常,才能进行回滚,默认情况下aop只捕获 RuntimeException 的异常,但可以通过配置来捕获特定的异常并回滚
换句话说在service的方法中不使用try catch 或者在catch中最后加上throw new runtimeexcetpion(),这样程序异常时才能被aop捕获进而回滚
想要不向上抛异常,也就是在service就捕获异常,而且注解还生效的方法:
在service层方法的catch语句中增加:TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();语句,手动回滚,这样上层就无需去处理异常
要是你对于事物的基础知识不太清楚,或想了解Spring使用事物的几种方式可以参考我的有道云笔记:
参考:springBoot service 事务注解@Transactional不起作用的解决
:Spring中@Transactional事务回滚(含实例详细讲解,附源码)