spring源码之事务篇(事务管理器整个流程)
一、序言
在企业级应用中,数据一致性是核心诉求之一,而事务(Transaction)正是保障数据一致性的关键机制。事务的 ACID 特性(原子性、一致性、隔离性、持久性)确保了一系列操作要么全部成功,要么全部失败,避免了中间状态导致的数据混乱。
Spring 框架通过抽象化的事务管理机制,将开发者从底层数据源的事务控制细节中解放出来,实现了 “业务逻辑与事务管理的解耦”。其核心优势在于:
- 声明式事务:通过注解(如
@Transactional
)或 XML 配置即可完成事务定义,无需手动编写begin
/commit
/rollback
代码; - 跨资源适配:统一适配 JDBC、Hibernate、MyBatis 等持久层框架,以及 JTA 分布式事务,底层通过
PlatformTransactionManager
接口屏蔽差异; - 灵活的事务属性:支持自定义隔离级别、传播行为、超时时间等,满足复杂业务场景需求。
本文将从源码角度深入剖析 Spring 事务管理器的核心流程,揭示从 “事务开启” 到 “提交 / 回滚” 的完整逻辑,帮助开发者理解 Spring 事务的底层实现原理。
二、核心逻辑
Spring 事务管理的核心逻辑围绕 “事务管理器(TransactionManager)” 展开,其本质是通过 “模板方法模式” 和 “状态管理” 实现对事务全生命周期的控制。核心流程可概括为以下四步:
1. 事务定义:描述事务属性
事务的核心属性通过TransactionDefinition
接口定义,包括:
- 传播行为(Propagation):定义事务在嵌套调用中的传播规则(如
REQUIRED
、REQUIRES_NEW
等); - 隔离级别(Isolation):控制事务间数据可见性(如
READ_COMMITTED
、SERIALIZABLE
等); - 超时时间(Timeout):事务执行的最长允许时间,超时则自动回滚;
- 只读属性(ReadOnly):标记事务是否为只读操作,优化数据库性能。
开发者通过@Transactional
注解或 XML 配置指定这些属性,Spring 在启动时将其解析为TransactionDefinition
实例。
2. 事务启动:获取事务状态
当业务方法被调用时,Spring 通过 AOP 拦截器触发事务管理器的getTransaction(TransactionDefinition definition)
方法,核心逻辑包括:
- 判断当前是否存在事务:通过
TransactionSynchronizationManager
(事务同步管理器)检查线程绑定的事务资源; - 处理传播行为:根据
TransactionDefinition
的传播规则,决定是 “加入当前事务”“创建新事务” 还是 “以非事务方式执行”; - 创建事务状态:若需要新建事务,底层会获取数据源连接、设置隔离级别、关闭自动提交(
connection.setAutoCommit(false)
),并生成TransactionStatus
实例记录事务状态(如是否为新事务、是否有保存点等)。
3. 事务执行:业务逻辑与异常监控
事务启动后,Spring 执行目标业务方法,并通过TransactionStatus
跟踪事务状态:
- 正