Spring源码级理解Spring事务(总体第四篇)

2022/3/19 17:30:04

本文主要是介绍Spring源码级理解Spring事务(总体第四篇),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

上一篇文章中已经学习到我们的Spring对JdbcTemplate的一些操作,之前也学习到AOP和IOC的一些内容,需要的朋友可以在我主页查找,接下来学习Spring事务。

1、什么是事务

(1)概念

  • 事务是数据库操作最基本的单元,逻辑上是一组操作,要么都成功,要么都失败。比如说银行转账的问题,两个人转账问题,一个人钱增加多少,另外一个人就要减少多少钱。如果有一个人失败,则另外一个人也不会变化。

(2)四大特性

  • 原子性(A):不可分割,要么都成功,要么都失败
  • 一致性(C):就相当于总量不变形
  • 隔离性(I) :多事务操作的时候,不会相互产生影响
  • 持久性(D):就比如表的提交问题,持续完成

2、搭建实验环境

  • 首先新建数据库和表(这里用赚钱的例子来演示)
    在这里插入图片描述
  • 创建service,搭建到,完成对象创建和注入关系
    • 首先如下是不变的
      在这里插入图片描述
    • 创建类和注入相关内容
      在这里插入图片描述
      在这里插入图片描述
    • 在dao里面创建两方法,多钱的方法和少钱的方法
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述

3、引入事务常见

上面的代码中,我们正常执行是完全没什么问题,但是,但是,但是如果出错了,那怎么办,钱转错了,我把一个人小目标转给你了在我们国家肯定是你负责,你是非法占有,那咱们还怎么可能有用户来使用呢,如果有如下异常的话,就成什么样子呢

  • 看演示就说明一些了
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    一个人的钱确确实实减少了,但是另外一个人的钱却没有增加,那岂不是有问题。

  • 对上面就要使用事务了撒,有异常等一系列问题都是无法整体完成的

  • 事务的操作过程

    • 第一步开启事务操作
    • 第二步进行业务操作
    • 第三步对异常进行捕获
    • 第四部对事物进行回滚

4、Spring事务管理介绍

(1)事务的理解

  • 我们的项目有三层,我们应该把事务加到哪一层呢?答案是随便都可以,但是在service层最好。
    在这里插入图片描述
  • 在Spring里面有两种方式
    • 编程试(上面讲的一种就是采用的编程式,代码臃肿)
    • 声明式(比较常用)

(2)事务的声明式(原理其实就是AOP)

  • 基于注解方式(常用)
  • 基于XML配置文件方式

(3)在spring中进行事务管理

  • 提供了一个接口:代理事务管理器,这个接口针对不同的框架提供不同的实现类:PlatformTransactionManager:
    在这里插入图片描述
    不同的框架采用的是不同的实现类来处理的,想我们的JdbcTemplate和Mybatis都是采用DataSourceTransaction来处理的

5、注解方式实现事务管理

(1)试验环境上验证

  • 配置文件中配置事务管理器
    在这里插入图片描述
  • 在配置文件中开启事务管理注解
    在这里插入图片描述
    在这里插入图片描述
  • 在service层类上面添加(或者在其方法上添加)注解
    在这里插入图片描述
    或者添加到某一个可能出错的方法上面.
    特点:如果添加到类上就类里面的所有方法都添加上了

(2)声明式事务中的参数配置

在这里插入图片描述

  • propagation:表示事务的传播行为,多个事务方法直接进行调用,这个过程汇总事务是如何进行管理的
    • 所谓事务方法,就是那些会到时数据库表发生变化的方法
    • 所谓传播行为就是有事务方法去调用没事务方法的方法进行调用的问题
      在这里插入图片描述
    • Spring框架事务传播行为如下
      在这里插入图片描述
      • required:如果add方法里面本身是有事务的,调用update也会采用add里面的方法,如果add没有,则会创建一个新的事务进行操作。
      • required_new:使用add方法调用update方法,这个update无论是否有事务,都会创建一个新的事务
      • 其他的大概看一下,只有用到再来看。
    • 进行配置(默认就是采用的如下)
      在这里插入图片描述
  • isolation:表示事务的隔离级别
    • 事务有特性称为隔离性,多事务操作之间不会产生影响,不考虑隔离性性会产生很多问题,包括如下
      • 脏读:一个未提交的事务,读取到了另外一个未读的事务的数据。【看如下图,如果东方不败修改为100,然后岳不群修改为60000,而后东方不败又检测到没有修改,而岳不群又进行回滚,这是两个之间就产生了脏读】
        在这里插入图片描述
      • 不可重复读:一个未提交事务,读到了另外一个已修改后的数据。
        在这里插入图片描述
      • 虚读:一个未提交事务,读到了另外一个已添加后的数据。
    • 解决:通过设置事务的隔离级别,解决读问题。
      在这里插入图片描述
    • 设置隔离级别:如果是采用mysql的话,默认采用Repeatable Read
      在这里插入图片描述
  • timeout:超时时间,事务需要在一定时间内,进行提交,如果不提交就要进行事务的回滚,默认值采用的是-1,【可以设置为以秒为单位进行配置】
    在这里插入图片描述
  • readOnly:是否只读
    • 读查询操作,写添加修改和删除
    • readOnly默认为false,表示可以查询,可以添加修改和删除操作。
    • 设置readOnly值时true,设置为true之后,只能查询。
    • 进行设置
      在这里插入图片描述
  • rollbackFor:回顾
    • 设置哪些异常进行事务回滚
    • 配置就是rollbackFor=你异常的类
  • noRollbackFor:不回滚
    • 设置哪些异常不进行回滚

6、XML文件配置式完成事务管理

  • 用这种比较少用,需要了解,尽可能掌握。

  • 肯定是如下步骤:配置文件中配置事务管理【就是创建那个对应的对象】,配置通知【增强部分】,配置切入点【那个类的那个方法上】和切面【如何配置】
    在这里插入图片描述
    在这里插入图片描述

7、完全注解开发

@Configuration
@EnableTransactionManagement//开始事务
@ComponentScan("cn.mldn")
public class TxConfig {

    @Bean
    public DruidDataSource getDruidDateSource() {
        //这里面进行设置
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        //其他也是一样
        return dataSource;
    }

    @Bean
    public JdbcTemplate getJdbcTemplate(DataSource dataSource) {
        JdbcTemplate jdbcTemplate = new JdbcTemplate();
        //到IOC容器里面找到,进行注入。
        jdbcTemplate.setDataSource(dataSource);
        return jdbcTemplate;
    }


    @Bean
    public DataSourceTransactionManager getDdat() {
        DataSourceTransactionManager sourceTransactionManager = new DataSourceTransactionManager();
        //在这里进行配置
        return sourceTransactionManager;
    }
}


这篇关于Spring源码级理解Spring事务(总体第四篇)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程