思维导图
一、什么是事务?
多条DML要么同时成功,要么同时失败
@Transaction(tx)
二、事务的四个过程:
1.开启事务(start transaction)
2.执行核心业务代码
3.提交事务(如果核心业务处理过程中没有出现异常)(commit transaction)
4.回滚事务(如果核心业务处理……出现异常)(rollback transaction)
三、事务的四个特性(ACID)是什么?
- 原子性:不可分割,事务是最小的工作单元,
- 一致性:事务前后总量不变,要么成功都成功,要么失败都失败
- 隔离性:多操作之间不会产生影响就。事务和事务之间因为有隔离性,才可以保证互不干扰
- 持久性:一个事务一旦被提交,它对数据库的数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其他有任何影响(结束的标志)
四、Spring事务管理
1、事务添加J2EE三层结构里面Service层(业务逻辑层)
2、在Spring进行事务管理操作两种方式:
①、编程式事务管理(自己写流程)
②、声明式事务管理:基于注解方式、基于xml配置文件方式
3、声明式事务管理:
基于注解方式
基于xml配置文件方式
4、在Spring进行声明式事务管理,底层使用AOP原理
5、Spring事务管理API:
PlatformTransactionManager
五、注解是什么?
@Transaction
六、可以用在哪里?
类上:类里的所有方法都添加事务
方法上:只是为方法添加事务
七、创建事务管理器
1.开启事务注解
2.在service类上面(或者service类里面方法上面)添加事务注解:@Transactional,这个注解添加到类上面,也可以添加方法上面
a.如果把这个注解添加类上面,这个类里面所有的方法都添加事务
b.如果把这个注解添加方法上面
八、事务属性
1、传播行为
传播行为是什么?
在service类中有a()方法和b()方法,a()方法上有事务,b()方法上也有事务,当a()方法执行过程中调用b()方法,事务是如何传递的?合并到一个事务里?还是开启一个新的事务?这就是事务传播行为。
①、枚举类型
事务传播行为在spring框架中被定义为枚举类型:
②、传播行为有哪些?
REQUIRED:支持当前事务,如果不存在就新建一个(默认)【没有就新建,有就加入】
SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行
MANDATORY:必须运行在一个事务中,如果当前没有事务正在发生,就抛出一个异常
NOT_SUPPORTED:以非事务方式运行,如果有事务存在,挂起当前事务【不支持事务,存在就挂起】
NEVER:以非事务方式运行,如果有事务存在,抛出异常【不支持事务,存在即抛异常】
NESTED:如果当前正有一个事务在进行中,则该方法应当运行在一个嵌套式事务中,被嵌套的事务可以独立于外层事务进行提交或回滚,如果外层事务不存在,行为就像REQUIRED一样【没有事务就像和REQUIRED一样】
③、如何使用传播行为?
2、事务隔离级别
①、事务为什么要有隔离?
是为了解决多个并行事务竞争导致的数据安全性问题的一种规范
多个事务竞争可能会出现三种不同的现象:脏读、不可重复读、幻读
②、数据库中读取数据存在的三大问题:(三大读问题)
。脏读:读取到没有提交到的数据库的数据
。不可重复读:同一事务当中,第一次和第二次读取的数据不一样
。幻读:读到的数据是假的
—脏读
读取了还未提交的数据,然后回滚了
脏数据:还没有完全确定下来的数据
—不可重复读
指更新操作
对某个数据多次查询,但是返回了不同的结果。因为在查询间隔,被另一个事务修改并提交了
例如,一个编辑人员两次读取同一文档(如QQ或钉钉在线文档),但在两次读取之间,作者重写了该文档。当编辑人员第二次读取文档时,文档已更改。原始读取不可重复。如果只有在作者全部完成编写后编辑人员才可以读取文档,则可以避免该问题
—幻读
指增加、删除操作
读取了提交的新事务
事务A在多次读取数据的时候,另一个事务B对这个数据进行了增加或删除操作,导致事务A多次多次读取的数据不一致。
不可重复读和幻读的区别?
二者描述的则重点不同,不可重复读描述的侧重点是修改操作,而幻读描述的侧重点是添加和删除操作。
③、事务隔离级别有哪些?
- 读未提交:read_uncommitted
。有脏读问题
- 读提交:read_committed
。解决了脏读问题,其他事务提交之后才能督导,但存在不可重复读问题
- 可重复读:repeatable_read
。解决不可重复读,可达到重复读效果,只要当前事务不结束,读取到的数据一直都是一样的,存在幻读问题
- 序列化:serializable
。解决幻读问题,事务排队执行,不支持并发
3、只读事务(readOnly)
作用:spring启动优化策略
@Transactional(readOnly=true)
将当前事务设置为只读事务,在该事务执行过程中只允许select语句执行,delete、insert、update都不可执行
作用是:启动spring的优化策略,提高select语句执行效率(如果该事务中确实没有增删改操作,建议设置为只读事务)
(意思是:如果事务只读的话,最好设置为只读的,意思是在告诉spring框架你可以启动自己的优化策略了,来提高select的查询效果)
4、设置哪些异常回滚事务
@Transactional(rollbackFor = RuntimeException.class)
表示当发生RuntimeException异常时就回滚事务
5、设置哪些异常不回滚事务
@Transactional(rollbackFor = NullPointerException.class)
表示当发生NullPointerException异常不回滚,其他都回滚
Spring系列文章:
如果有想要交流的内容欢迎在评论区进行留言,如果这篇文档受到了您的喜欢那就留下你点赞+收藏脚印支持一下博主~