一、事务回顾
1.事务特性(ACID)
A: 作为一个不可拆分的整体,最小单位
C:一致性
I:隔离性
D:持久性
3.事务并发引起的问题
脏读:一个事务读取到另一个 还未提交的数据
不可重复读:一个是一个事务读取到另一个 已经提交的数据(修改)
幻(虚)读:一个是一个事务读取到另一个 已经提交的数据(新增或删除)
3.数据库隔离级别
mysql默认的隔离级别是什么? 可重复读 → mysql不会导致幻读
二、Spring事务管理介绍
1.Spring事务管理常用对象
PlatformTransactionManager
TransactionDefinition
TransactionStatus
2.PlatformTransactionManager——spring事务管理的核心
平台事务管理器,spring要管理事务,必须使用事务管理器
进行事务配置时,必须配置事务管理器。
有多种实现,通过实现此接口,Spring可以管理任何实现了这些接口的事务。开发人员可以使用统一的编程模型来控制管理事务。
常见的事务管理器的实现:
DataSourceTransactionManager ,jdbc开发时事务管理器,采用JdbcTemplate、mybatis
HibernateTransactionManager,hibernate开发时事务管理器,整合hibernate
PlatformTransactionManager api详解:
TransactionStatus getTransaction(TransactionDefinition definition) ,
事务管理器 通过“事务详情”,获得“事务状态”,从而管理事务。 获取事务状态后,Spring根据传播行为来决定如何开启事务;
void commit(TransactionStatus status) 根据状态提交
void rollback(TransactionStatus status) 根据状态回滚
3.TransactionStatus——中间变量
这个接口的作用就是获取事务的状态(回滚点、是否完成、是否新事务、是否回滚)属性
4.TransactionDefinition
这个接口的作用就是定义事务的名称、隔离级别、传播行为、超时时间长短、只读属性等。
传播行为:
如何共享事务 → 包含事务方法之间的互相调用
ServiceA → methodA
ServiceB → methodB
- Required:如果没有事务,新建一个事务;如果有事务,就加入进来;看为同一个事务 → 一荣俱荣,一损俱损 →要么一起提交了,要么一起回滚。
- Requires_new:如果没有,新建一个事务;如果有,就当做是一个新的事务。→ 自私 → methodB调用了methodA,methodB发生异常:B回滚,A不回滚 ;methodA发生异常:A回滚,B也回滚。
- nested:嵌套事务 → 集体和个人关系 → 个人如果不在了,没有影响;集体不在了,人也没了 methodB调用methodA。methodB发生异常:AB都回滚 ;methodA发生异常:A回滚,外围B不回滚。
三、事务案例
转账案例:
PlatformTransactionManager → datasource
搭建一个转账业务
实现方式1——手动增加事务TransactionTemplate
实现方式2——半自动TransactionProxyFactoryBean
实现方式3——advisor
pointcut:指定方法增加事务
advice:
实现方式4——声明式事务注解(最重要,最常用,最简单)
指哪儿打哪儿
1.打开注解开关
2.@Transactional