前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Transactional注解不生效案例

Transactional注解不生效案例

作者头像
CBeann
发布2023-12-25 18:50:02
2790
发布2023-12-25 18:50:02
举报
文章被收录于专栏:CBeann的博客CBeann的博客

源码下载

ChaiRongD/Demooo - Gitee.com

不生效场景1:try-catch捕获了

不生效原因:内部逻辑把异常捕获吞了,所以不生效

代码语言:javascript
复制
@Transactional
 public void transactionalNotEffect01() {
    try {
      Person p1 = new Person();
      p1.setName(LocalDateTime.now().toString());
      personDao.insertSelective(p1);
      int i = 1 / 0;
    } catch (Exception e) {
      e.printStackTrace();
      System.out.println("my error");
    }
  }

不生效场景2:方法不使用public修饰

不生效原因:他会判断是不是public,源码中明确规定

代码语言:javascript
复制
@Service
public class StudentService {

  @Autowired private PersonDao personDao;


  // 不生效2
  @Transactional
  protected void transactionalNotEffect02() {
    Person p1 = new Person();
    p1.setName(LocalDateTime.now().toString());
    personDao.insertSelective(p1);
    int i = 1 / 0;
  }
  
}
代码语言:javascript
复制
@RestController
public class TransactionalNotEffect02Controller {

  @Autowired private StudentService studentService;

  @GetMapping("/transactionalNotEffect02")
  public Object getAll(){
      studentService.transactionalNotEffect02();
    return 1;
  }
}

不生效场景3:通过this调用,没有走代理方法

不生效原因:自己掉自己的方法,这样方式不会走代理,所以事务失效

代码语言:javascript
复制
 // 不生效3
  public void transactionalNotEffect03() {
    this.addPerson();
  }

  @Transactional
  public void addPerson() {
    Person p1 = new Person();
    p1.setName(LocalDateTime.now().toString());
    personDao.insertSelective(p1);
    int i = 1 / 0;
  }
代码语言:javascript
复制
@RestController
public class StudentController {

  @Autowired private StudentService studentService;

  @GetMapping("/transactionalNotEffect03")
  public Object transactionalNotEffect03() throws Exception {
    studentService.transactionalNotEffect03();
    return 1;
  }
}

不生效场景4:@Transactional 注解属性 propagation 设置错误

不生效原因:见下面的

参考:Spring中propagation的7种事务配置_sayoko06的博客-CSDN博客_propagation

代码语言:javascript
复制
@Service
public class StudentService {

  @Autowired private PersonDao personDao;

  // 不生效4
  @Transactional(propagation= Propagation.NOT_SUPPORTED)
  public void transactionalNotEffect04() {
    Person p1 = new Person();
    p1.setName(LocalDateTime.now().toString());
    personDao.insertSelective(p1);
    int i = 1 / 0;
  }
}
代码语言:javascript
复制
@GetMapping("/transactionalNotEffect04")
  public Object transactionalNotEffect04() throws Exception {
    studentService.transactionalNotEffect04();
    return 1;
  }

不生效场景5:@Transactional的rollbackFor 属性与实际异常不匹配

根本原因:rollbackFor属性监听的是RuntimeException,而下面的代码是FileNotFoundException。不是父子关系,没有交集,匹配失败,所以事务失效。

代码语言:javascript
复制
  @Transactional(propagation = Propagation.REQUIRED,rollbackFor = RuntimeException.class)
  public void transactionalNotEffect05() throws Exception{
    Person p1 = new Person();
    p1.setName(LocalDateTime.now().toString());
    personDao.insertSelective(p1);
    //不存在的文件
    int read = new FileInputStream(new File("D://尚硅谷周阳老师//1.txt")).read();
  }

不生效场景6:数据库引擎不支持事务

不生效场景7:线程不同不支持事务

不生效原因:事务回滚的单位是建立在connection上,而connection是存在ThreadLocal中,因为不同的线程ThreadLocal存的connection自然不一样,那该场景就不符合预期(都回滚)了。

代码语言:javascript
复制
  // 不生效7
  @Transactional(propagation = Propagation.REQUIRED,rollbackFor = Exception.class)
  public void transactionalNotEffect07() {
    Person p1 = new Person();
    p1.setName(LocalDateTime.now().toString());
    personDao.insertSelective(p1);
    new Thread(
            () -> {
              Person p2 = new Person();
              p2.setName(LocalDateTime.now().toString());
              personDao.insertSelective(p2);
              int i = 1 / 0;
            },
            "t1")
        .start();
  }

参考

1 尚硅谷周阳老师分享

2 Spring中propagation的7种事务配置_sayoko06的博客-CSDN博客_propagation

3 @Transactional注解不起作用解决办法及原理分析_嘎嘎的博客-CSDN博客_@transactional 不生效

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-08-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 源码下载
  • 不生效场景1:try-catch捕获了
  • 不生效场景2:方法不使用public修饰
  • 不生效场景3:通过this调用,没有走代理方法
  • 不生效场景4:@Transactional 注解属性 propagation 设置错误
  • 不生效场景5:@Transactional的rollbackFor 属性与实际异常不匹配
  • 不生效场景6:数据库引擎不支持事务
  • 不生效场景7:线程不同不支持事务
  • 参考
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档