• 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

    在这里插入图片描述

  • 相关阅读:
    Java数据结构 | PriorityQueue详解
    Python基础学习笔记3
    线性查找(思路分析和代码实现) [数据结构][Java]
    《数据结构与算法之美》读书笔记1
    Vue3学习笔记:ref函数、reactive函数等常用Composition API、生命周期,Fragment、teleport等新的组件用法记录
    一文理解分布式开发中的服务治理
    与世界分享我刚编的mysql http隧道工具-hersql原理与使用
    【TCPDF】使用TCPDF导出PDF文件
    Electron基础学习笔记
    Linux内核UART串口子系统驱动框架详解
  • 原文地址:https://blog.csdn.net/weixin_50659410/article/details/127585106