• 【Spring】事务和事务传播机制


    Author: 老九
    个人博客:老九的CSDN博客
    ?? 个人名言:不可控之事 乐观面对
    ?? 系列专栏:Spring系列

    文章目录

    为什么需要事务

    • 事务是将一组操作封装成一个执行单元,要么全部成功,要么全部失败。如果没有事务,转账操作就会出现异常,因此需要保证原子性。

    Spring 声明事务

    • 只需要在方法上添加@Transactional注解就可以实现,无需手动开启和提交事务,如果中途发生异常就会自动回滚事务。

    • @Transactional既可以修饰方法也可以修饰类,修饰方法只能修饰public方法

    • 注意:@Transactional在异常被捕获的情况下,事务就不会自动回滚

      @Transactional(isolation = Isolation.READ_COMMITTED) // 开启事务
      @RequestMapping(“/insert”)
      public int insert(){
      UserInfo userInfo = new UserInfo();
      userInfo.setName(“AOP”);
      userInfo.setPassword(“123456”);
      return userService.add(userInfo);
      }

      @Transactional(isolation = Isolation.READ_COMMITTED) // 开启事务
      @RequestMapping("/insert2")
      public int insert2(){
          UserInfo userInfo = new UserInfo();
          userInfo.setName("AOP");
          userInfo.setPassword("123456");
          int result = userService.add(userInfo);
          System.out.println("MySQL影响的行数:"+result);
          int num = 10/0;
          return result;
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11

    Transactional参数说明

    在这里插入图片描述

    propagation

    • 事务的传播行为,默认为Propagation.REQUIRED

    isolation

    • Spring有5种隔离级别,MySQL有四种隔离级别,Spring多了一个DEFAULT,以连接的数据库的事务隔离级别为主

    在这里插入图片描述

    timeout

    • 表示事务的超时时间,默认值为-1,如果事务执行时间超过超时时间,就会自动回滚

    事务回滚失效解决方案

    1. 直接抛出异常

      @Transactional(propagation = Propagation.REQUIRED) // 开启事务
      @RequestMapping("/insert2")
      public int insert2(){
          UserInfo userInfo = new UserInfo();
          userInfo.setName("AOP");
          userInfo.setPassword("123456");
          int result = userService.add(userInfo);
          System.out.println("MySQL影响的行数:"+result);
          try {
              int num = 10/0;
          }catch (Exception e){
              result = 0;
              e.printStackTrace();
              throw e;//解决事务失效的问题
             // TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
          }
          return result;
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
    2. 在catch中使用代码手动进行事务的回滚操作

        @Transactional(propagation = Propagation.REQUIRED) // 开启事务
      @RequestMapping("/insert2")
      public int insert2(){
          UserInfo userInfo = new UserInfo();
          userInfo.setName("AOP");
          userInfo.setPassword("123456");
          int result = userService.add(userInfo);
          System.out.println("MySQL影响的行数:"+result);
          try {
              int num = 10/0;
          }catch (Exception e){
              result = 0;
              e.printStackTrace();
              //throw e;//解决事务失效的问题
              TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
          }
          return result;
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18

    @Transactional工作原理

    • @Transactional是基于AOP实现的,AOP又是使用动态代理实现的。如果目标对象实现了接口,默认情况下会采用JDK的动态代理,如果目标对象没有实现了接口,会使用CGLIB动态代理。@Transactional在开始执行业务之前,通过代理先开启事务,在执行成功之后再提交事务。如果中途遇到了异常,则回滚事务。

    Spring 事务的传播机制

    • 定义:Spring中多个事务相互调用时,他们之间的行为方式是如何执行的

    为什么需要事务传播机制?

    • 事务的隔离级别是保证多个并发事务执行的可控性(稳定性),而事务传播机制是保证一个事务在多个调用方法间的可控性

    传播机制的类型

    在这里插入图片描述
    在这里插入图片描述

    嵌套事务和加入事务的区别

    • 整个事务如果全部执行成功,二者的结果是一样的
    • 如果事务执行到一半失败了,那么加入事务整个事务会全部回滚;而嵌套事务会局部回滚,不会影响上一个方法中执行的结果

    ————————————————————————
    码字不易,大家的支持就是我坚持下去的动力
    版权声明:本文为CSDN博主「」的原创文章

    先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦

  • 相关阅读:
    大模型系统和应用——Prompt-learning & Delta Tuning
    Day 58 django 视图层 模板层
    [ linux ] ufw 命令 -- 管理netfilter防火墙的程序
    运行谷歌开源BERT程序时遇到的bug修改记录
    ssh基于WEB的农产品销售管理系统
    ElasticSearch综合练习题,ES为8版本,使用Kibana运行语句
    如何将 PDF 转换为 Word:前 5 个应用程序
    k8s部署xxl-job后,执行任务提示拒绝连接Connection Refused
    Spring Bean 的生命周期
    还在纠结笔记工具的选择么? 各种笔记工具帮你总结了
  • 原文地址:https://blog.csdn.net/m0_67390969/article/details/126080679