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

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.dtcms.com/a/363712.html

相关文章:

  • 高校党建信息管理系统的设计与实现-(源码+LW+可部署)
  • wpf模板之DataTemplate
  • HTML第五课:求职登记表
  • apache-jmeter-5.1.1安装部署与使用教程(小白一看就会)​
  • Docker启动两个Redis镜像并配置一主一从
  • Spring Boot数据脱敏方案
  • sed相关知识
  • C++基础组件
  • 【值得收藏】手把手教你用PyTorch构建Transformer英汉翻译系统,从训练到推理
  • 小程序蓝牙低功耗(BLE)外围设备开发指南
  • C++革命性新特性:默认实例导出(exportDefault)让单例模式变得无比简单!
  • Vue2 入门(一)介绍及Demo项目创建
  • GISBox内置免费GIS服务器:地形服务发布与应用全指南
  • ChartView的基本使用
  • Redis 的压缩列表:像快递驿站 “紧凑货架“ 一样的内存优化结构
  • Redis-底层数据结构篇
  • 8.30美团技术岗算法第二题
  • 【C++】15. ⼆叉搜索树
  • WordPress.com 和 WordPress.org 之间的区别说明
  • 系统架构——过度设计
  • IO_HW_9_2
  • 教你 Centos 如何离线安装 rlwrap 插件(内网环境)
  • MATLAB矩阵及其运算(三)矩阵的创建
  • 一文搞懂:0-1整数规划与蒙特卡罗模拟(附MATLAB代码详解)
  • 命令行文本处理小工具:cut、sort、uniq、tr 详解与应用
  • 从零开始的python学习——函数(2)
  • shell复习(2)
  • Flutter环境搭建全攻略之-windows环境搭建
  • 毫米波雷达信号处理步骤顺序
  • 树莓派网页监控