Spring 事务管理机制
Spring 没有直接提供事务的直接支持,它对外提供统一的 API,真正的事务提供者是实现了这一套 API 的 ORM 框架或者是其他支持事务的框架,例如 Hibernate、Mybatis 等等。
Spring 对事务管理的抽象层主要包括3个接口,TransactionDefinition、PlatformTansactionManager、TransactionStatus。
TransactionDefinition 用来描述 XML 配置和注解扫描的事务属性,包括隔离级别、传播属性、超时时间等
PlatformTansactionManager 根据 TransactionDefinition 提供的事务配置创建事务,并用 TransactionStatus 描述这个事务的状态。
PlatformTansactionManager 提供了开始事务、提交事务和回滚事务三个方法,并要求事务的提供者实现。
Spring 事务分类
Spring 事务机制主要包括编程式事务和声明式事务。
- 编程式事务
编程式事务需要我们用代码实现,它也分为两种,一种是第三方框架实现的事务模板,显示的处理事务,另外一种是原生的事务管理,即用代码实现获取连接、事务提交、回滚、异常处理等操作。 - 声明式事务
声明式事务使用 AOP 面向切面编程实现,本质上是在目标方法执行前创建一个事务或者加入一个已有的事务,在执行方法后根据实际情况选择提交或是回滚事务。
Spring 事务管理的接口
Spring 事务管理主要包括 3 个接口。
- PlatformTansactionManager(事务管理器):定义了如下三个方法。
# 获取当前事务状态
TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException;
# 当前事务提交
void commit(TransactionStatus status) throws TransactionException;
# 当前事务回滚
void rollback(TransactionStatus status) throws TransactionException;
- TransactionDefinition(事务定义信息):定义了五个方法;七个事务传播行为的属性;五个隔离级别的属性;一个超时时间的属性
# 七个传播行为的属性:
int PROPAGATION_REQUIRED = 0; # 默认的传播行为。如果当前存在事务,使用当前事务;如果当前不存在事务,创建一个新事务
int PROPAGATION_SUPPORTS = 1; # 如果当前存在事务,使用当前事务;如果不存在事务,以非事务方式执行
int PROPAGATION_MANDATORY = 2; # 强制使用事务,如果当前不存在事务,抛出异常
int PROPAGATION_REQUIRES_NEW = 3; # 不管当前有没有事务,都要新建一个事务,如果当前存在事务,将当前事务挂起
int PROPAGATION_NOT_SUPPORTED = 4; # 以非事务方式执行,如果当前存在事务,将当前事务挂起
int PROPAGATION_NEVER = 5; # 不允许事务,如果当前存在事务,抛出异常
int PROPAGATION_NESTED = 6; # 如果当前存在事务,那么使用嵌套事务;如果当前不存在事务,操作类似与 PROPAGATION_REQUIRED
# 五个隔离级别的属性(一个 Spring 的默认隔离级别(即使用数据库的隔离级别)和四个数据库对应的隔离级别)
int ISOLATION_DEFAULT = -1;
int ISOLATION_READ_UNCOMMITTED = Connection.TRANSACTION_READ_UNCOMMITTED;
int ISOLATION_READ_COMMITTED = Connection.TRANSACTION_READ_COMMITTED;
int ISOLATION_REPEATABLE_READ = Connection.TRANSACTION_REPEATABLE_READ;
int ISOLATION_SERIALIZABLE = Connection.TRANSACTION_SERIALIZABLE;
# 超时时间的属性
int TIMEOUT_DEFAULT = -1; # 使用数据库默认的超时时间
# 五个方法
int getPropagationBehavior(); # 获取当前事务的传播行为
int getIsolationLevel(); # 获取当前事务的隔离级别
int getTimeout(); # 获取当前事务的超时时间
boolean isReadOnly(); # 判断当前事务是否只读
String getName(); # 返回当前事务的名称
- TransactionStatus(事务运行状态):定义了判断当前事务是否是新创建的事务、当前事务是否有保存点、设置当前事务应该回滚、判断当前事务是否应该回滚、刷新会话中的数据到数据库、当前事务是否已经完成。
boolean isNewTransaction(); # 判断当前事务是否是新事务
boolean hasSavepoint(); # 判断当前事务是否有保存点
void setRollbackOnly(); # 设置当前事务需要回滚
boolean isRollbackOnly(); # 判断当前事务是否需要回滚
void flush(); # 将数据刷新到数据库
boolean isCompleted(); # 判断当前事务是否完成