在开发Springboot项目的时候,一般我们要处理事务的时候只需要在方法上加个注解@Transactional就搞定了,轻松+愉快有木有。
有时候我们写了一个比较长的方法,里面一部分功能需要事务,还有一部分不想让他进事务该怎么处理呢?
简单,把需要处理事处的那部分代码独立抽取出来加个@Transactional就搞定了哈。
不过需要注意的是,在同一个类里的时候,因为springboot的传播机制,事务会失效,所以在同一个类里的时候调用方法,使用AopContext来获取一下代理,再来调用方法就可以了。
TestClass bean = (TestClass)AopContext.currentProxy();
bean.methodName();
这样事务就生效了。
还有几点要注意的是:
1、要想事务生效的话方法必须是public的。
2、不要把异常捕捉处理掉,处理完了就会认为没问题,自然就不会触发事务了。
3、默认是只会在Error 或runtimeException时触发回滚,如果想在别的异常时触发自已设置一下如:
@Transactional(rollbackFor = Exception.class)
这样所有异常就都会回滚了。不过一般用默认就可以了,这个看情况自己处理。