• Spring事务


    Spring事务

    简介

    • 事务的作用:在数据层保障一系列的数据库操作同成功,同失败。

    • Spring事务作用:在数据层或业务层保障一系列的数据库操作同成功,同失败。

      • 如何保障的呢:

    银行账户转账

    • 需求:实现任意两个账户间的转账操作
    • 需求微缩:A账户减钱,B账户加钱

    分析:

    1. 数据层提供基础操作,指定账户减钱(outMoney),指定账户加钱(inMoney)
    2. 业务层提供转账操作(transfer),调用减钱与加钱的操作
    3. 提供两个账户和操作金额执行转账操作
    4. 基于Spring整合MyBatis环境搭建上述操作

    结果分析:

    1. 程序正常执行时,账户金额A-B加,没有问题
    2. 程序出现异常后,转账失败,但是异常之前操作成功,异常之后操作失败,整体操作失败。(A账户减钱,B账户没有加钱,所以整体业务失败),必须能做到,同成功,同失败。

    解决方法

    • 第一步//配置当前接口方法具有事务
      @Transactional

      这里开了事务,但是使用怎样的事务管理器,还是没有说

      public interface AccountService {
          /**
           * 转账操作
           * @param out 传出方
           * @param in 转入方
           * @param money 金额
           */
          //配置当前接口方法具有事务
          @Transactional
          public void transfer(String out,String in ,Double money) ;
      }
      
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
    • 第二步:到配置中,配置一个事务管理器

      jdbcConfig
      //配置事务管理器,mybatis使用的是jdbc事务
          @Bean
          public PlatformTransactionManager transactionManager(DataSource dataSource){
              DataSourceTransactionManager transactionManager = new DataSourceTransactionManager();
              transactionManager.setDataSource(dataSource);
              return transactionManager;
          }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
    • 第三步:去SpringConfig中告诉Spring 我们现在使用注解式事务驱动

      //开启注解式事务驱动
      @EnableTransactionManagement

    注意:

    1. 一般在业务层接口上添加Spring事务管理,也可以在实现类上添加事务。降低耦合

    2. 注解式事务可以添加在业务层方法上,表示当前方法开启事务,也可以添加到接口上表示,当前及接口的所有方法开启事务。

    3. 设置事务管理器,事务管理器要跟几乎实现技术进行选择,MyBatis框架使用的是JDBC事务。

    4. 开启注解式事务驱动,在SpringConfig中添加@EnableTransactionManagement

    5. 事务角色(可以将多个事务,管理成一个事务)

      • 事务管理员:发起事务方,在Spring中通常指代业务层开启事务的方法
      • 事务协调员:加入事务方,在Spring中通常指代数据层方法,也可以是业务层方法

    事务相关配置

    在这里插入图片描述

     //有些异常默认不参与回滚的,我们得手动给他加上回滚   
    //rollback:设置当前事务参与回滚的异常,默认非运行时异常不参与回滚
    @Transactional(rollbackFor = IOException.class)
    public void transfer(String out,String in ,Double money) throws IOException;
    
    • 1
    • 2
    • 3
    • 4

    案例:转账业务追加日志

    需求:实现两个账户间转账操作,并 对每次转账操作在数据库进行留痕

    需求微缩:A账户减钱,B账户加钱,数据库记录日志。

    分析:

    • 基于转账操作案例添加日志模块,实现数据库中记录日志
    • 业务层转账操作(transfer),调用减钱,加钱与记录日志功能

    实现效果预期:

    • 无论转账是否成功,均进行转账操作日志留痕

    事务传播行为

    事务协调员对事务管理员所携带事务的处理态度

    //propagation设置事务属性:传播行为设置为当前操作需要新事务
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    
    • 1
    • 2

    在这里插入图片描述

  • 相关阅读:
    【win11远程桌面访问--基于云端服务器(腾讯云为例)&frp的内网穿透实现】
    GO语言篇之反射
    java计算机毕业设计家教信息管理系统MyBatis+系统+LW文档+源码+调试部署
    图文解析 Nacos 配置中心的实现
    Java查询多条数据放入word模板 多个word文件处理成zip压缩包并在前端下载.zip文件
    Whale 帷幄:用户旅程的「情绪算法」
    免费开源的100套Echarts大屏数据可视化模板分享
    易错知识点3
    Excel文件解析--超大Excel文件读写
    数学建模笔记
  • 原文地址:https://blog.csdn.net/weixin_50659410/article/details/127585106