当前位置: 首页 > backend >正文

Spring 事务原理解析:AOP 的一次完美落地

Spring 事务原理解析:AOP 的一次完美落地

在企业开发中,事务是保证数据一致性和完整性的重要手段。Spring 通过声明式事务(@Transactional)极大简化了开发者的使用。但很多学员只会用,却不清楚 Spring 事务的底层原理。本文带你从生活类比、原理、源码和图解彻底理解 Spring 事务。


一、生活中的事务类比

想象你在银行转账:

  1. 从 A 账户扣 100 元
  2. 给 B 账户加 100 元

如果只扣了钱但没加上,就会乱套。

事务的本质:一组操作要么全部成功,要么全部失败(原子性)。


二、Spring 事务核心思想

Spring 事务的本质:
基于 AOP 的方法拦截,在方法执行前后由事务管理器控制数据库连接的提交和回滚。

执行流程:

  1. 方法调用前:开启事务
  2. 方法执行:正常执行 SQL
  3. 方法执行成功:提交事务
  4. 方法执行异常:回滚事务

三、事务传播与隔离

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

八、学员易错点总结

  1. 私有方法/内部调用失效

    • Spring AOP 默认基于代理,内部调用不会走代理。
  2. 事务传播问题

    • REQUIRED 与 REQUIRES_NEW 不同,嵌套方法要注意事务是否挂起或加入。
  3. 异常导致事务不回滚

    • 默认只回滚 RuntimeException,检查 SQLException 或自定义异常要设置 rollbackFor
  4. 事务失效的 7 种常见场景

    • @Transactional 不在 Spring 管理的类上
    • 方法不是 public
    • 内部方法调用
    • 等等(可在公众号文章中展开)

九、总结

  • Spring 事务本质:AOP + TransactionInterceptor + PlatformTransactionManager
  • 核心流程:方法前开启事务 → 执行 → 成功提交 / 异常回滚
  • 理解事务传播机制和易错点,是保证系统数据一致性和面试高频问题的关键

http://www.xdnf.cn/news/19712.html

相关文章:

  • 深度学习——基于卷积神经网络实现食物图像分类【4】(使用最优模型)
  • 广度优先搜索(BFS, Breadth-First Search)
  • 数字化转型的六大天问:你的项目为何失败
  • 数据开发工作了一年,准备跳槽,回顾一些面试常见问题,大数据面试题汇总与答案分享
  • 【3D打印】3D打印机首次使用心得
  • 2025最新“Java 面试八股文 + 各大厂的面试真题”限时开源
  • 人工智能助力流感疫苗选择:MIT 团队推出 VaxSeer 系统
  • Understanding the Flap T in American English
  • 开源企业级快速开发平台(JeecgBoot)
  • Python闭包机制:原理、应用与安全防护
  • 【Doris入门】Doris数据表模型:聚合模型(Aggregate Key Model)详解
  • java-设计模式-4-创建型模式-工厂
  • 【52页PPT】服务业数字化转型如何做(附下载方式)
  • Ubuntu 用户和用户组
  • X86、X64 与 ARM:架构的剖析与比较
  • webpack性能优化指南
  • MacOS - 记录MacOS发烫的好几天 - 幕后黑手竟然是
  • 神经网络|(十八)概率论基础知识-伽马函数溯源-阶乘的积分表达式
  • k8s常用命令
  • 对矩阵行化简操作几何含义的理解
  • HDI是什么?与普通线路板有何区别?优势在哪?
  • 嵌入式git分支管理策略
  • Java基础第9天总结(可变参数、Collections、斗地主)
  • 魔域服务器多少钱一个月?魔域服务器配置要求及推荐
  • Linux 入门到精通,真的不用背命令!零基础小白靠「场景化学习法」,3 个月拿下运维 offer,第二十四天
  • 鸿蒙Next开发指南:XComponent与Progress组件的深度解析与实践
  • 在 PySpark 中解锁窗口函数的力量,实现高级数据转换
  • 数控机床相邻轨迹最大过渡速度计算方法介绍
  • 【Kubernetes】知识点2
  • 【数学建模学习笔记】时间序列分析:LSTM