news 2026/9/3 6:18:14

Spring事务管理(生效机制及原理)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Spring事务管理(生效机制及原理)

一、Spring事务机制的底层原理

1.@Transactional的本质

@Transactional的本质是AOP 代理 + 事务拦截器:调用方调用的是代理对象,事务的开启 / 提交 / 回滚全部由TransactionInterceptor织入完成。

原理总结:

@EnableTransactionManagement开启事务能力 → 容器为 Bean 生成 AOP 代理 → 方法调用进入TransactionInterceptor→ 用PlatformTransactionManager管理事务生命周期,数据库连接绑定在当前线程的 ThreadLocal,从而保证同一事务内 SQL 走同一连接。

二、核心抽象:3个接口

接口职责关键内容
PlatformTransactionManager事务管理器(顶层)getTransaction()/commit()/rollback()
TransactionDefinition事务属性定义隔离级别、传播行为、超时、只读、回滚规则
TransactionStatus事务运行时状态是否新事务、是否已完成、是否存在保存点

常见实现类DataSourceTransactionManager(JDBC / MyBatis 常用)、JpaTransactionManagerHibernateTransactionManagerJtaTransactionManager(分布式)

三、事务传播行为

REQUIREDvsREQUIRES_NEWvsNESTED

  • REQUIRED 加入外层事务(一个异常全部回滚);
  • REQUIRES_NEW 挂起外层开新事务(内层异常不影响外层已提交);
  • NESTED 是保存点式嵌套(内层异常只回滚内层,外层可继续)。

四、隔离级别

隔离级别脏读不可重复读幻读说明
DEFAULT使用数据库默认值
READ_UNCOMMITTED可能可能可能最低级别,几乎不用
READ_COMMITTED可能可能Oracle 默认,行级锁
REPEATABLE_READ可能(MySQL 借助 MVCC+next-key lock 可避免)MySQL InnoDB 默认
SERIALIZABLE最高,串行化,性能差

五、@Transactional关键属性

@Transactional( transactionManager = "txManager", // 指定事务管理器(多数据源时) propagation = Propagation.REQUIRED, // 传播行为,默认 REQUIRED isolation = Isolation.DEFAULT, // 隔离级别,默认随数据库 timeout = 10, // 超时(秒),超时自动回滚 readOnly = true, // 只读优化(查询方法建议开启) rollbackFor = Exception.class, // 指定回滚的异常类型 noRollbackFor = SomeException.class // 指定不回滚的异常 )

六、事务失效场景

场景原因与解决
同类 this 自调用A.methodA()内部调this.methodB(),B 的 @Transactional 不走代理。解决:注入自身代理 / 拆成两个 Bean / 用AopContext.currentProxy()
方法不是 publicSpring 默认只拦截 public 方法,非 public 不报错但事务不生效
类未被 Spring 管理类没加@Service/@Component,未生成代理
方法为 finalCGLIB 无法代理 final 方法(无接口时)
异常被 try-catch 吞掉事务感知不到异常,无法回滚。要么抛出,要么手动TransactionAspectSupport.currentTransactionStatus().setRollbackOnly()
抛的是检查异常默认只回滚RuntimeException/Error,检查异常需配rollbackFor
传播行为设置不当NOT_SUPPORTED / NEVER,或 REQUIRES_NEW 误用导致内层不随外层回滚
数据库引擎不支持MyISAM 等不支持事务,需用 InnoDB
多线程场景连接绑定在父线程 ThreadLocal,子线程拿不到同一事务;REQUIRES_NEW+ 新线程常见误区
代理对象类型问题类无接口时未启用 CGLIB(老版本需配置proxyTargetClass=true

七、底层原理要点

  1. 代理创建@EnableTransactionManagement→ 注册BeanFactoryTransactionAttributeSourceAdvisor,为匹配的方法生成代理(JDK 动态代理 / CGLIB)。
  2. 拦截器链TransactionInterceptor implements MethodInterceptor,在invoke()中执行invokeWithinTransaction()
  3. 事务资源绑定TransactionSynchronizationManagerThreadLocal保存当前线程的Connection和事务同步信息 —— 这是 "同一事务同一条连接、传播行为能感知外层事务" 的根本原因。
  4. 回滚判定TransactionInfo记录事务状态,异常时按rollbackOn()规则决定是否回滚。
  5. 数据源与事务关系DataSourceTransactionManager通过DataSourceUtils.getConnection()拿连接并设置autoCommit=false,提交 / 回滚后归还连接。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/3 6:17:16

从审图号到GIS数据:坐标转换、属性录入与Shapefile生成全流程

简介:本资源为依据国家审图号GS(2023)2767制作的标准化GIS地理数据包,面向地理信息、测绘、国土规划及遥感相关专业的初学者与从业者,解决权威底图数据缺失、制图规范难统一、多源空间数据集成困难等实际问题。压缩包共75个文件,总…

作者头像 李华
网站建设 2026/9/3 6:16:54

MATLAB机器学习项目实战:从代码包解构到工程化部署全流程指南

简介:本资源是面向机器学习初学者与MATLAB进阶用户的实践型教程包,聚焦于利用MATLAB Statistics and Machine Learning Toolbox系统实现监督学习、无监督学习及模型评估全流程。资源共48个文件,涵盖21个核心MATLAB脚本(如Decision…

作者头像 李华
网站建设 2026/9/3 6:15:30

数据中心 IBMS:解读算力机房的系统集成逻辑

在大型数据中心内部,存在供配电、制冷、BA 楼宇自控、安防消防、动环监控等数十套独立子系统。各系统分属不同厂商,协议、数据格式各不相同,很容易形成数据孤岛。运维人员需要登录多个平台查看信息,故障发生时难以完成跨系统协同处…

作者头像 李华
网站建设 2026/9/3 6:13:17

基于STM32与蓝牙模块的智能家居控制系统实战开发指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/3 6:12:07

英雄联盟怀旧服完整安装指南:从客户端准备到服务器连接

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/3 6:09:45

汇川SV660F伺服Profinet通信GSD文件详解与实战配置

简介:本资源是汇川SV660F系列变频器适配PROFINET通信的核心配置文件包,面向工业自动化工程师、PLC系统集成人员及产线调试技术人员,解决变频器与西门子TIA Portal等PROFINET主站设备快速组态、I/O映射定义及诊断参数配置等实际工程问题。压缩…

作者头像 李华