文章目录
一、什么是事务
- 事务的概念:原子性的且要求同时成功、同时失败的操作,我们可以将其封装为一个事务
- Spring的事务和数据库的事务是一个概念
- 我们在执行数据库操作时,可能会同时执行多个操作。比如A转账给B,我们需要先给A扣钱,再给B加钱,这两步操作要求【同时失败,同时成功】,如果失败了,需要【执行回滚操作】
- 事务通常是在项目中操作,直接在MySQL上操作的场景是比较少的
- MySQL的事务实现操作:
- start:开启事务
- commit:提交事务
- rollback:回滚事务
二、Spring对事务的实现
2.1 方式一:编程式事务(手动写代码操作事务)
- 解析:程序员手动开启、提交、回滚事务
- 代码实现:
2.2 方式二:声明式事务(利用注解自动开启和提交事务)
- 比较推荐该方法,因为比较简单:
- 代码实现:
- 关于@Transactional注解:主要要了解三个部分(rollbackFor异常回滚属性、Isolation事务的隔离级别、Propagation事务的传播机制)
三、事务遇到异常的情况
3.1 原则
- 看重整体方法:事务看重的是一整个实现方法有无异常,而非里面的实现细节有无出错
- 如果有实现细节里【有异常且没有解决】,Spring就会认为是整个方法出错了,从而回滚事务
- 当实现细节内部对异常进行了处理,@Transaction是不知道的,他会认为整个方法没有错,从而不回滚
- 如果异常在当前地方没有处理,就会抛给调用方
3.1 出现了异常,但进行了捕获/又抛出来了
异常内部没处理或没处理好,Transaction就会回滚,处理好了,它不管
3.2 不抛出异常,但是执行回滚
3.3 事务默认的异常处理
二、事务隔离级别
2.1 MySQL的事务隔离级别
- SQL标准定义了四种隔离级别,MySQL、Oracle等都支持了
- Mysql对隔离级别的支持:
- 查询当前事务隔离级别:可以查询全局事务隔离级别和当前连接的事务隔离级别
select @@global.tx)isolation,@@tx.isolation;
2.2 Spring 事务隔离级别
这是Spring对事务的支持,至于MyBatis支持什么,是与MyBatis的驱动和配置有关
- 类别:下面的四种都可以对标SQL中的标准
- Isolation.DEFAULT:以连接的数据库的事务隔离级别为主
- Isolation.READ_UNCOMMITTED:读未提交
- Isolation.READ_COMMITTED:读已提交
- Isolation.REPEATABE:可重复读
- Isolation.DEFAULT:串行化
- 关于Spring事务隔离级别和下面事务传播机制的选择:先用默认的,遇到bug再改即可
三、事务传播机制
3.1 什么是事务传播机制
- 适用范围:数据库中没有,Spring里才有这个传播机制
- 为什么会出现事务传播机制:
3.2 事务传播机制如何实现
七种传播机制
重点:默认的传播机制REQUIRED
重点:REQUIRES_NEW
3.3 其他
- Propagation.SUPPORTS:如果当前存在事务,则加入该事务,如果当前没有事务,则以非事务的方式继续运行
- Propagation.NEVER:以非事务方式运行,如果当前存在事务,则抛出异常
- Propagation.NESTED:
- Propagation.MANDATORY:如果当前存在事务,则加入该事务。如果当前没有事务,则抛出异常。
- Propagation.NOT_SUPPORTED:以非事务方式运行,如果当前存在事务,就把当前事务挂起(不用)