service层@Transactional事务控制使用以及注意

来源:互联网 发布:软件项目管理发展前景 编辑:程序博客网 时间:2024/06/11 18:28

@Service@Transactionalpublic class CeshiService {    @Autowired    LoginFeignClient loginFeignClient;    @Transactional(rollbackFor = Exception.class)    public void test(){        User user=null;        //try {            log.info("ceshi transactional is 1");            user=loginFeignClient.test1().getData();            throw  new RuntimeException();            //log.info("ceshi transactional is 2");           // loginFeignClient.test();       // }catch (Exception e){        //    throw new Exception(e.getLocalizedMessage());       // }    }}

上述就是一个事务的service,当获取到throw的exception时执行rollback;

1.service中是通过feign调用远程服务时,上述写法是无法回滚的,只有repository在本地代码处理才可以,因为db提供了回滚处理。

2.如果是feign远程调用,又想使用事务,则需要进行逆服务处理,需要获取异常时,手动调用逆服务处理

3.非事务声明方法调用事务声明方法,则事务失效。使用了@Transactional的方法,对同一个类里面的方法调用, @Transactional无效。比如有一个类Test,它的一个方法A,A再调用Test本类的方法B(不管B是否public还是private),但A没有声明注解事务,而B有。则外部调用A之后,B的事务是不会起作用的。(经常在这里出错)

4.一个service中声明事务方法,调用了另外一个service中的声明事务方法,则被调用的方法事务也还起作用,事务不太建议放到2个见service中。下面的例子,下面的事务是起作用的,跟上面第3条写的注意区分:





原创粉丝点击