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

Spring 事务机制深度解析

本文档基于对 Spring Framework 源码的深入分析详细阐述了 Spring 事务的管理机制、核心流程以及与 JDBC/JPA 的交互细节。1. 核心架构组件Spring 事务管理采用策略模式与模板方法模式相结合的设计主要包含以下核心组件组件职责PlatformTransactionManager事务管理器接口定义了getTransaction,commit,rollback等核心操作。TransactionDefinition事务定义包含传播行为、隔离级别、超时时间、只读标志等属性。TransactionStatus事务状态记录当前事务是否为新事务、是否已完成、是否标记为回滚等。TransactionInterceptorAOP 拦截器负责在方法调用前后织入事务逻辑。TransactionSynchronizationManager使用ThreadLocal管理当前线程绑定的资源如 Connection和同步回调。2. 事务生命周期与调用链路2.1 完整调用流程当一个带有Transactional注解的方法被调用时执行流程如下AOP 拦截:TransactionInterceptor.invoke()捕获方法调用。获取事务属性: 解析方法或类上的Transactional注解生成TransactionAttribute(txAttr)。创建/加入事务: 调用createTransactionIfNecessary()。若txAttr null直接执行业务逻辑不走事务流程。若txAttr ! null调用PlatformTransactionManager.getTransaction()。开启事务 (doBegin):如果需要新事务调用DataSourceTransactionManager.doBegin()。获取数据库连接设置autocommit false。将连接绑定到TransactionSynchronizationManager。执行业务逻辑: 调用目标方法如 Service 中的业务代码。提交/回滚:成功: 调用commitTransactionAfterReturning()-doCommit()-con.commit()。异常: 调用completeTransactionAfterThrowing()-doRollback()-con.rollback()。清理资源: 解绑连接恢复autocommit状态归还连接池。2.2 doBegin() 的调用时机doBegin()不会在以下情况调用方法没有Transactional注解 (txAttr null)。传播行为为SUPPORTS且当前无事务。传播行为为NOT_SUPPORTED。传播行为为REQUIRED但当前已存在事务此时会加入现有事务。doBegin()会在以下情况调用传播行为为REQUIRED/REQUIRES_NEW/NESTED。且当前线程没有活跃的事务或者REQUIRES_NEW强制挂起旧事务开启新的。3. 无事务注解时的行为分析3.1 纯 JDBC (JdbcTemplate) 场景如果 Service 方法和 Repository 均未添加Transactional事务管理: Spring不介入事务管理doBegin()不会被调用。连接获取: 每次数据库操作都会从连接池获取一个新连接。提交机制: 依赖 JDBC 驱动的Auto-Commit机制。Connection.getAutoCommit()默认为true。每条 SQL 执行完毕后JDBC 驱动会自动向数据库发送COMMIT。后果: 每条 SQL 都是一个独立的原子操作无法保证多条操作之间的原子性。3.2 Spring Data JPA (Repository) 场景如果 Service 方法未加Transactional但调用了userRepository.save()隐式事务: Spring Data JPA 的默认实现类SimpleJpaRepository的save()方法上标注了Transactional。调用位置:doBegin()会在Repository 层被调用。执行流程:Service 调用repository.save()。AOP 拦截SimpleJpaRepository.save()。发现注解触发doBegin()开启一个短事务。执行em.persist()SQL 在事务提交前 Flush。方法结束触发doCommit()。后果: 虽然单条保存有事务保障但 Service 层多次调用 Repository 时每次调用都是独立的事务。如果中间发生异常之前已提交的 Repository 操作无法回滚。4. 关键设计思想4.1 声明式事务 (Declarative Transaction)通过 AOP 将事务逻辑与业务逻辑解耦。开发者只需添加注解无需手动编写begin/commit/rollback代码。4.2 资源绑定 (Resource Binding)利用ThreadLocal确保同一个事务内的所有数据库操作使用同一个 Connection。这是实现事务原子性的基础。4.3 延迟提交 (Lazy Commit)在事务开启后SQL 执行并不会立即提交到数据库而是等到业务方法成功执行完毕由 Spring 统一调用con.commit()。4.4 异常驱动回滚默认情况下只有遇到RuntimeException或Error时才会触发回滚。Checked Exception 默认不回滚除非显式配置rollbackFor。5. 常见误区澄清误区真相没加注解SQL 就不会执行SQL 会正常执行并通过 Auto-Commit 立即持久化。Spring 会自动为所有方法加事务Spring 遵循“显式优于隐式”必须显式添加注解或配置。Repository 层的 save 总是安全的如果 Service 层没事务Repository 的 save 只是单条 SQL 的原子无法保证业务层面的原子性。txAttr 为 null 时也会调用 doBegin绝对不会。txAttr null是事务拦截的第一道防线直接跳过事务逻辑。6. 总结Spring 事务的核心在于AOP 拦截与Connection 资源的线程绑定。有注解时: Spring 接管连接关闭 Auto-Commit统一控制提交与回滚。无注解时: 回归 JDBC 默认行为依赖 Auto-Commit每条 SQL 独立提交。在实际开发中为了保证业务数据的 consistency一致性建议在Service 层的入口方法上添加Transactional以确保整个业务单元作为一个完整的事务执行。
http://www.zskr.cn/news/1359719.html

相关文章:

  • 重磅资源!《大语言模型VIP+50+Python入门资料PDF》全套学习指南
  • 超市陈列这样做,顾客逛得不想走,员工执行不犯错
  • 大一新生怎么合理利用github?用好Github
  • 为什么很多企业买三维扫描设备之前问“多少钱”,用了一段时间后开始问“值不值”?
  • 香港6月雨季来临,房屋漏水怎么办?卫生间免砸砖防水、外墙、屋面+地下室渗漏。权威防水公司靠谱TOP5推荐(2026年6月本地最新深度调研) - 企业资讯
  • 618运营忙不过来?让AI来接管
  • AI进行简历筛选:如何将5小时筛选压缩至48分钟,彻底解决“招错人“难题?
  • mysql从5.7升级到8.0后ONLY_FULL_GROUP_BY是升级后应用报错的第一大原因
  • 3步解决魔兽争霸3在现代电脑上的三大兼容难题
  • 保山6月雨季来临,房屋漏水怎么办?卫生间免砸砖防水、外墙、屋面+地下室渗漏。权威防水公司靠谱TOP5推荐(2026年6月本地最新深度调研) - 企业资讯
  • myssh
  • 企业级应用通过Taotoken实现AI能力冗余与故障转移设计
  • ACS770还能打吗?最近测试了一款国产霍尔电流传感器
  • 硬核根基,智能载体:华清远见嵌入式“硬件+仿真+课程+师资”产教融合与实践教学方案
  • RAG-重排序策略
  • 【AI营销】为什么你的网站内容再好,AI也只引用其中一页?
  • 阿里云ACP云计算| 20人团考全员通过,恭喜!
  • 【限时解密】Lindy自动化方案未公开的4层权限熔断机制:为什么92%的企业跳过这步就触发合规雷区?
  • 3种实战方法搞定Docker镜像加速:从零到精通完全指南
  • Taotoken的Token Plan套餐如何帮助初创团队控制AI成本
  • 5款必备Illustrator脚本:让你的设计效率提升300%
  • 回收福禄克Fluke 5730A多功能校准器
  • AI Agent写诉状=执业风险?司法部新规生效倒计时30天,这4类文书必须人工复核
  • 如何快速找到互作基因?酵母筛库破解互作奥秘
  • Poppler Windows版:终极PDF处理方案,3分钟零配置部署指南
  • 如何通过NVIDIA Profile Inspector深度优化游戏性能:解锁显卡隐藏设置的完整指南
  • 防城港6月雨季来临,房屋漏水怎么办?卫生间免砸砖防水、外墙、屋面+地下室渗漏。权威防水公司靠谱TOP5推荐(2026年6月本地最新深度调研) - 企业资讯
  • 别只看页面:盲盒源码小程序V6MAX系统与盲盒app源码程序解析 - 壹软科技
  • 个人报告6:学习资料上传与可配置解释来源
  • Flutter_01 工具准备1