浅谈@Transactional 注解的使用

在SpringBoot的开发项目中,

在Controller控制层,我们一般只做入参的校验;

在Service服务层,我们把业务逻辑都写在这里,在服务层的方法中,我们会调用其它的服务层接口或者mapper层方法,

所以,需要在服务层的方法上,我们需要增加:

@Transactional(rollbackFor = Exception.class)

添加该注解后,只要服务层的方法中有异常的,所有的操作都会回滚。

需要注意的是:

1、事务方法内部捕捉了异常,没有抛出新的异常,导致事务操作不会进行回滚。

解决方法:

1.在注解后面添加具体回滚的异常类:rollbackFor = Exception.class

2.将 catch 到的异常向上抛出 throw new Exception(e);,异常交给注解处理

 try {

    xxxMapper.insert(vo);
  } catch (Exception e) {
    e.printStackTrace();
    throw new Exception(e);

  }

2、Transactional注解标必须添加在public方法上,如果不是public方法,@Transactional注解不会起作用。

3、在同一个类内部,A方法调用B方法,类内部方法上面的@Transactional注解标注的方法,这种情况下也不会生效。

 原因分析:spring 中采用动态代理来实现事务,当同一个 中A方法调用 B方法时,不是代理类在调用,所以扫描不到事务注解

解决方案1:将 被调用的方法B放到另一个类中,方法A再去调用另一个类中的B方法就可以了(推荐使用);

解决方案2:在同一个类中自己注入自己,用自己的代理类去调用B方法,这样也可以被代理。

posted @ 2024-04-19 11:11  勇敢-的心  阅读(22)  评论(0编辑  收藏  举报