目录标题
- Spring 框架的事务处理
- 事务的基本概念
- 事务的特性[ACID]
- Spring 框架 事务平台
- ①事务的传播性 [Propagation]
- ②事务的隔离性 [isolation]
- ③事务的只读性
- ④事务的超时性
- ⑤事务的回滚性
- PlatformTransactionManager 接口
- TransactionStatus 接口
- SavepointManager 接口
- Spring 申明式事务的使用
- 开发步骤
Spring 框架的事务处理
Spring框架的核心:
- IOC 技术 【必需】,它的目的是对象的自动注入
- AOP 【可选】, 它的目的是代码增强
注:Spring框架的事务管理是基于AOP机制,它支持两种:
- 编程式事务操作 【使用不多,因为它是侵入式的】
- 申明式事务操作【使用较多,是基于AOP的】
事务的基本概念
什么是事务【transaction]?
通俗来讲,就是一组相关的操作,如果是数据库事务,就是一组相关的SQL操作,它们要么一起成功,要么一起失败。
事务的特性[ACID]
- 原子性, Atomic, 指的是事务不可分割性
- 一致性,Consistency, 当事务结束后,内存数据与底层数据是完全一致的。
- 隔离性,Isolation,多个事务之间是互相隔离的。
- 持久层,Durability, 当事务正确提交后,数据永不丢失。
如果是数据库事务的话,则目前所有主流的数据库产品都是支持事务的,也就是说,它们都遵守以上4个特性。
注:Spring框架并不是直接与底层的数据库产品直接操作事务,而是提供一个“事务抽象层”,它叫 事务管理平台,它自己定义了多个事务的属性,可以由程序员来控制。
Spring 框架 事务平台
- TransactionDefinition 接口,此接口是Spring框架对事务属性的定义,从如下几个不同的角度来定义事务属性:
①事务的传播性 [Propagation]
PROPAGATION_MANDATORY
强制要加入事务,如果没有事务,则抛出异常PROPAGATION_NESTED
如果已有事务,则加入嵌套事务之中,没有的话,则创建新的事务PROPAGATION_NEVER
不支持当前事务,如果有事务,则抛出异常PROPAGATION_NOT_SUPPORTED
不支持当前事务,始终以非事务方式执行PROPAGATION_REQUIRED
如果已有事务,则支持当事务,没有的话,则创建新的事务PROPAGATION_REQUIRES_NEW
如果已有事务,则挂起当前事务,并开启新事务,如果没有,直接开启新事务PROPAGATION_SUPPORTS
如果已有事务,则支持当前事务,如果没有,则以非事务方式执行。
②事务的隔离性 [isolation]
- ISOLATION_DEFAULT 采用底层数据存储的默认事务隔务级别
- ISOLATION_READ_UNCOMMITED 表示允许脏读、不可重复性、幻读 的隔离级别
- ISOLATION_READ_COMMITED 表示不允许脏读,但是存在不可重复性、幻读 的隔离级别
- ISOLATION_REPEATABLE_READ 表示不允许脏读和不可重复读,但是允许幻读 的隔离级别
- ISOLATION_SERIALIZABLE 表示不允许脏读和不可重复读以及幻读 的隔离级别
- 什么叫脏读[Dirty Read], 表示一个事务可以读取到另一个事务没有提交的数据。
- 什么叫不可重复读[non repeatable read], 表示在同一个事务中,执行相同的SQL语句,两次读到的 列值内容不一样。
- 什么叫幻读[phantom], 是一种特列的不可重复读,表示在同一个事务中,执行相同的SQL语句,两次读到的行数量不一样。
注: 事务的隔离级别越高,并发的性能就越低。
③事务的只读性
isReadOnly 表示事务是否是只读的。
④事务的超时性
Timeout 表示事务在指定的时间内拿不到锁,就抛出事务超时异常
⑤事务的回滚性
rollback 指定回滚的操作
PlatformTransactionManager 接口
平台事务管理器接口,是Spring框架为统一事务处理抽象出来的一个独立平台的事务管理器,它有不同的实现:
- DataSourceTransactionManager 针对连接池的事务管理器,包括 JDBC技术、mybatis框架都是采用这种事务管理器, 注:不支持分布式事务。
- JtaTransactionManager 针对容器支持的事务管理器,一般是 weblogic和webshpere 应用服务器。
- HibernateTransactionManager, 专门针对Hibernate框架而提供的一个事务管理器。
- WebLogicJtaTransactionManager 支持分布式事务管理
- WebSphereUowTransactionManager 支持分布式事务管理
- 如果以上提供的事务管理类不足以满足你的要求,则可以自定义一个类,继承 AbstractPlatformTransactionManager 抽象父类,并实现 commit和rollback方法
TransactionStatus 接口
用来记录事务的状态的,里面有判断事务状态、事务保存点的方法,以及设置成只读事务的操作方法
SavepointManager 接口
事务保存点管理器接口,它提供了创建事务保存点、删除事务保存点以及回调到事务保存点的操作
注:以上每一个接口,Spring框架都提供了内置的实现。
Spring 事务管理图
Spring 申明式事务的使用
前提:
- 要开启AOP:
在 AppConfig 配置类中,使用@EnableTransactionManagement
来开启事务处理- 导入相关的依赖:
导入 spring-jdbc 的依赖即可,它会间接依赖spring-tx
依赖
开发步骤
- 准备一个 maven 项目
- 在 AppConfig.java 中,使用
@EnableTransactionManagement
来开启事务处理, 并且要指定使用哪个具体的事务管理器,此处我们选择DataSourceTransactionManager
- 在需要添加事务的类型上或者方法上,打上 @Transactional 注解即可