Spring 事务

一、什么是事务

  1. 事务的概念:原子性的且要求同时成功、同时失败的操作,我们可以将其封装为一个事务
    • Spring的事务和数据库的事务是一个概念
    • 我们在执行数据库操作时,可能会同时执行多个操作。比如A转账给B,我们需要先给A扣钱,再给B加钱,这两步操作要求【同时失败,同时成功】,如果失败了,需要【执行回滚操作】
  2. 事务通常是在项目中操作,直接在MySQL上操作的场景是比较少的
  3. MySQL的事务实现操作
    • start:开启事务
    • commit:提交事务
    • rollback:回滚事务

二、Spring对事务的实现

2.1 方式一:编程式事务(手动写代码操作事务)

  1. 解析:程序员手动开启、提交、回滚事务
  2. 代码实现
    在这里插入图片描述
    在这里插入图片描述

2.2 方式二:声明式事务(利用注解自动开启和提交事务)

  1. 比较推荐该方法,因为比较简单
  2. 代码实现
    在这里插入图片描述
  3. 关于@Transactional注解:主要要了解三个部分(rollbackFor异常回滚属性、Isolation事务的隔离级别、Propagation事务的传播机制)
    在这里插入图片描述

三、事务遇到异常的情况

3.1 原则

  1. 看重整体方法:事务看重的是一整个实现方法有无异常,而非里面的实现细节有无出错
    • 如果有实现细节里【有异常且没有解决】,Spring就会认为是整个方法出错了,从而回滚事务
    • 当实现细节内部对异常进行了处理,@Transaction是不知道的,他会认为整个方法没有错,从而不回滚
    • 如果异常在当前地方没有处理,就会抛给调用方

3.1 出现了异常,但进行了捕获/又抛出来了

异常内部没处理或没处理好,Transaction就会回滚,处理好了,它不管
在这里插入图片描述

3.2 不抛出异常,但是执行回滚

在这里插入图片描述

3.3 事务默认的异常处理

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

二、事务隔离级别

2.1 MySQL的事务隔离级别

  1. SQL标准定义了四种隔离级别,MySQL、Oracle等都支持了
    • Mysql对隔离级别的支持在这里插入图片描述
  2. 查询当前事务隔离级别:可以查询全局事务隔离级别和当前连接的事务隔离级别
select @@global.tx)isolation,@@tx.isolation;

2.2 Spring 事务隔离级别

这是Spring对事务的支持,至于MyBatis支持什么,是与MyBatis的驱动和配置有关

  1. 类别下面的四种都可以对标SQL中的标准
    • Isolation.DEFAULT:以连接的数据库的事务隔离级别为主
    • Isolation.READ_UNCOMMITTED:读未提交
    • Isolation.READ_COMMITTED:读已提交
    • Isolation.REPEATABE:可重复读
    • Isolation.DEFAULT:串行化
      在这里插入图片描述
  2. 关于Spring事务隔离级别和下面事务传播机制的选择:先用默认的,遇到bug再改即可

三、事务传播机制

3.1 什么是事务传播机制

  1. 适用范围:数据库中没有,Spring里才有这个传播机制
  2. 为什么会出现事务传播机制
    在这里插入图片描述

3.2 事务传播机制如何实现

七种传播机制

在这里插入图片描述

重点:默认的传播机制REQUIRED

在这里插入图片描述

重点:REQUIRES_NEW

在这里插入图片描述

3.3 其他

  1. Propagation.SUPPORTS:如果当前存在事务,则加入该事务,如果当前没有事务,则以非事务的方式继续运行
  2. Propagation.NEVER:以非事务方式运行,如果当前存在事务,则抛出异常
    在这里插入图片描述
  3. Propagation.NESTED
    在这里插入图片描述
  4. Propagation.MANDATORY:如果当前存在事务,则加入该事务。如果当前没有事务,则抛出异常。
  5. Propagation.NOT_SUPPORTED:以非事务方式运行,如果当前存在事务,就把当前事务挂起(不用)

相关推荐

  1. Spring事务

    2024-07-15 01:58:03       35 阅读
  2. Spring事务

    2024-07-15 01:58:03       19 阅读
  3. Spring 事务管理

    2024-07-15 01:58:03       60 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-15 01:58:03       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-15 01:58:03       71 阅读
  3. 在Django里面运行非项目文件

    2024-07-15 01:58:03       58 阅读
  4. Python语言-面向对象

    2024-07-15 01:58:03       69 阅读

热门阅读

  1. 数据结构第26节 广度优先搜索

    2024-07-15 01:58:03       18 阅读
  2. 共享云硬盘并发读写之集群文件系统

    2024-07-15 01:58:03       24 阅读
  3. Excel数据处理

    2024-07-15 01:58:03       20 阅读
  4. 虚拟专用网络(VPN)技术的研究与应用

    2024-07-15 01:58:03       21 阅读
  5. 0711,0712,0713 进程,进程之间的通信

    2024-07-15 01:58:03       17 阅读
  6. ZooKeeper实现分布式锁

    2024-07-15 01:58:03       18 阅读
  7. 了解微前端和qiankun

    2024-07-15 01:58:03       20 阅读
  8. Qt易错总结

    2024-07-15 01:58:03       23 阅读
  9. OpenAI 发布官方 .NET 库

    2024-07-15 01:58:03       20 阅读
  10. 技术探索之kotlin浅谈

    2024-07-15 01:58:03       20 阅读
  11. 企业网络安全工具整合与管控建议

    2024-07-15 01:58:03       21 阅读
  12. 构建图像金字塔遍历不同的大小

    2024-07-15 01:58:03       18 阅读
  13. 开源项目有哪些机遇与挑战?

    2024-07-15 01:58:03       21 阅读
  14. GIS就业相关问题快问快答

    2024-07-15 01:58:03       15 阅读
  15. 深入理解CSS中的 :: 和 :

    2024-07-15 01:58:03       23 阅读