Transactional注解不生效案例

简介: Transactional注解不生效案例

源码下载


ChaiRongD/Demooo - Gitee.com


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


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


@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,源码中明确规定


16.png


@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;
  }
}


@RestController
public class TransactionalNotEffect02Controller {
  @Autowired private StudentService studentService;
  @GetMapping("/transactionalNotEffect02")
  public Object getAll(){
      studentService.transactionalNotEffect02();
    return 1;
  }
}


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


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


 // 不生效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;
  }


@RestController
public class StudentController {
  @Autowired private StudentService studentService;
  @GetMapping("/transactionalNotEffect03")
  public Object transactionalNotEffect03() throws Exception {
    studentService.transactionalNotEffect03();
    return 1;
  }
}


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


不生效原因:见下面的


@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;
  }
}


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


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


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


  @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自然不一样,那该场景就不符合预期(都回滚)了。


  // 不生效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();
  }


目录
相关文章
|
7月前
|
XML Java 关系型数据库
@Transactional注解的失效场景
@Transactional注解的失效场景
115 1
|
7月前
|
Java 数据库 Spring
【spring(四)】Spring事务管理和@Transactional注解
【spring(四)】Spring事务管理和@Transactional注解
102 0
|
2月前
|
监控 Java 数据库
Spring事务中的@Transactional注解剖析
通过上述分析,可以看到 `@Transactional`注解在Spring框架中扮演着关键角色,它简化了事务管理的复杂度,让开发者能够更加专注于业务逻辑本身。合理运用并理解其背后的机制,对于构建稳定、高效的Java企业应用至关重要。
69 0
|
4月前
|
存储 NoSQL Java
工作 6 年,@Transactional 注解用的一塌糊涂
工作 6 年,@Transactional 注解用的一塌糊涂
|
5月前
|
数据库连接 数据库 开发者
Spring问题之使用@Transactional注解时需要注意哪些事项
Spring问题之使用@Transactional注解时需要注意哪些事项
|
6月前
|
SQL Java 数据库
Transactional注解讲解及使用
事务是数据库操作的一组集合,它作为一个工作单元,要求所有操作要么全部成功,要么全部失败。事务的四个基本特性是原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。
|
7月前
|
Java 编译器 Spring
@transactional注解失效情况
@transactional注解失效情况
|
Java 数据库 Spring
@Transactional注解超详细
@Transactional注解超详细
945 0
|
Java 数据库 Spring
@Transactional 注解失效问题
@Transactional 注解失效问题
112 0
|
XML Java 关系型数据库
【Spring基础系列4】注解@Transactional(一)
前面已经讲解了IOC的基础知识,以及Spring常用的注解,这篇文章是对上一篇文章《【Spring基础系列3】Spring常用的注解》的补充,由于这个注解需要讲述的内容比较多,一方面该注解非常重要,另一方面非常容易入坑,所以这个注解的内容,就单独放到这篇文章来讲。
220 0
【Spring基础系列4】注解@Transactional(一)