Spring 事务原理解析:AOP 的一次完美落地
Spring 事务原理解析:AOP 的一次完美落地
在企业开发中,事务是保证数据一致性和完整性的重要手段。Spring 通过声明式事务(@Transactional
)极大简化了开发者的使用。但很多学员只会用,却不清楚 Spring 事务的底层原理。本文带你从生活类比、原理、源码和图解彻底理解 Spring 事务。
一、生活中的事务类比
想象你在银行转账:
- 从 A 账户扣 100 元
- 给 B 账户加 100 元
如果只扣了钱但没加上,就会乱套。
事务的本质:一组操作要么全部成功,要么全部失败(原子性)。
二、Spring 事务核心思想
Spring 事务的本质:
基于 AOP 的方法拦截,在方法执行前后由事务管理器控制数据库连接的提交和回滚。
执行流程:
- 方法调用前:开启事务
- 方法执行:正常执行 SQL
- 方法执行成功:提交事务
- 方法执行异常:回滚事务
三、事务传播与隔离
1. 事务传播行为(Propagation)
类型 | 功能 |
---|---|
REQUIRED | 当前无事务新建,有则加入 |
REQUIRES_NEW | 挂起当前事务,新建一个事务 |
NESTED | 嵌套事务,支持保存点回滚 |
2. 事务隔离级别(Isolation)
类型 | 描述 |
---|---|
READ_UNCOMMITTED | 允许读未提交数据(脏读) |
READ_COMMITTED | 只能读已提交数据 |
REPEATABLE_READ | 可重复读 |
SERIALIZABLE | 串行化,最严格 |
四、事务执行流程图
flowchart TDA[调用 @Transactional 方法] --> B[TransactionInterceptor 拦截]B --> C[开启事务 beginTransaction]C --> D[执行目标方法]D --> E{方法执行结果}E -->|成功| F[提交事务 commit]E -->|异常| G[回滚事务 rollback]F --> H[返回结果]G --> H[返回结果]
五、源码解析
Spring 事务的核心类:
PlatformTransactionManager
:事务管理器接口DataSourceTransactionManager
:常用实现(JDBC)TransactionInterceptor
:AOP 拦截器,控制事务
1. 拦截器逻辑
@Override
public Object invoke(MethodInvocation invocation) throws Throwable {return invokeWithinTransaction(invocation.getMethod(), invocation.getThis(), invocation::proceed);
}
2. 方法调用与事务控制
protected Object invokeWithinTransaction(Method method, Object target, InvocationCallback invocation) throws Throwable {TransactionStatus status = txManager.getTransaction(txAttr);try {Object retVal = invocation.proceed();txManager.commit(status);return retVal;} catch (Throwable ex) {txManager.rollback(status);throw ex;}
}
六、事务传播机制图
flowchart TDA[调用事务方法] --> B{当前有事务?}B -->|有| C[REQUIRED - 加入当前事务]B -->|无| D[REQUIRED - 新建事务]B -->|无/有| E[REQUIRES_NEW - 挂起旧事务,新建新事务]B -->|有| F[NESTED - 创建保存点,支持嵌套回滚]
七、事务与 AOP 关系图
flowchart TDsubgraph AOP [Spring AOP]P1[切点 Pointcut - 匹配 @Transactional 方法]P2[通知 Advice - TransactionInterceptor]P3[代理 Proxy - JDK/CGLIB]endsubgraph TX [事务控制]T1[调用事务方法]T2[开启事务]T3{方法执行结果}T4[提交事务]T5[回滚事务]T6[返回结果]endP1 --> P2 --> P3 --> T1T1 --> T2 --> T3T3 -->|成功| T4 --> T6T3 -->|异常| T5 --> T6
八、学员易错点总结
-
私有方法/内部调用失效
- Spring AOP 默认基于代理,内部调用不会走代理。
-
事务传播问题
- REQUIRED 与 REQUIRES_NEW 不同,嵌套方法要注意事务是否挂起或加入。
-
异常导致事务不回滚
- 默认只回滚 RuntimeException,检查 SQLException 或自定义异常要设置
rollbackFor
。
- 默认只回滚 RuntimeException,检查 SQLException 或自定义异常要设置
-
事务失效的 7 种常见场景
- @Transactional 不在 Spring 管理的类上
- 方法不是 public
- 内部方法调用
- 等等(可在公众号文章中展开)
九、总结
- Spring 事务本质:AOP + TransactionInterceptor + PlatformTransactionManager
- 核心流程:方法前开启事务 → 执行 → 成功提交 / 异常回滚
- 理解事务传播机制和易错点,是保证系统数据一致性和面试高频问题的关键