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

spring中 方法上@Transation实现原理

Spring中@Transactional注解方法实现原理

Spring的@Transactional注解在方法级别实现事务管理的原理主要基于动态代理和拦截器机制,以下是其核心实现流程:

1. 代理创建阶段

当Spring容器启动时,会为带有@Transactional注解的类创建代理对象:

  1. Bean后处理器介入

    • InfrastructureAdvisorAutoProxyCreator识别需要事务管理的Bean

    • 对目标Bean创建AOP代理(JDK动态代理或CGLIB代理)

  2. 代理对象生成

    // 原始Bean
    public class UserServiceImpl implements UserService {@Transactionalpublic void createUser(User user) {// 业务逻辑}
    }// 生成的代理对象(伪代码)
    public class UserServiceProxy extends UserServiceImpl {private TransactionInterceptor txInterceptor;public void createUser(User user) {// 代理逻辑txInterceptor.invoke(new MethodInvocation() {// 包装原始方法调用});}
    }

2. 方法调用阶段

当调用代理对象的方法时,事务拦截器开始工作:

  1. 拦截器调用链

    客户端调用
    ↓
    Proxy.invoke()
    ↓
    TransactionInterceptor.invoke()
    ↓
    TransactionAspectSupport.invokeWithinTransaction()
  2. 事务准备流程

    protected Object invokeWithinTransaction(Method method, Class<?> targetClass, final InvocationCallback invocation) throws Throwable {// 1. 获取事务属性(解析@Transactional注解)TransactionAttribute txAttr = getTransactionAttributeSource().getTransactionAttribute(method, targetClass);// 2. 获取事务管理器PlatformTransactionManager tm = determineTransactionManager(txAttr);// 3. 根据传播行为决定事务操作TransactionStatus status = tm.getTransaction(txAttr);try {// 4. 执行原始方法Object result = invocation.proceedWithInvocation();// 5. 提交事务tm.commit(status);return result;} catch (Throwable ex) {// 6. 异常处理(决定是否回滚)completeTransactionAfterThrowing(txAttr, status, ex);throw ex;}
    }

3. 关键组件协作

组件作用
TransactionInterceptor方法调用的拦截器,包含核心事务逻辑
TransactionAttributeSource解析@Transactional注解属性
PlatformTransactionManager实际执行事务操作(begin/commit/rollback)
TransactionSynchronizationManager通过ThreadLocal管理事务上下文

4. 特殊场景处理

  1. 自调用问题

    public class OrderService {public void process() {this.updateOrder(); // 自调用不会经过代理,事务失效}@Transactionalpublic void updateOrder() {...}
    }

    解决方案:注入自身代理或拆分到不同类

  2. 异常回滚规则

    • 默认只对RuntimeExceptionError回滚

    • 可通过rollbackFor/noRollbackFor自定义

  3. 事务传播行为

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void methodA() {// 总是启动新事务
    }

5. 实现原理总结

  1. 代理机制:通过AOP创建代理对象包裹原始Bean

  2. 拦截处理:方法调用被TransactionInterceptor拦截

  3. 事务管理:根据注解属性执行事务开始/提交/回滚

  4. 线程绑定:使用ThreadLocal保持事务上下文一致性

  5. 资源协调:统一管理Connection等资源

这种设计实现了业务逻辑与事务管理的解耦,开发者只需通过注解声明事务需求,无需编写模板化的事务管理代码。

请再说下代理对象 事物拦截器,事物管理器之前关系及执行流程

http://www.lryc.cn/news/580326.html

相关文章:

  • C++20中的counting_semaphore的应用
  • C++ 模板参数匹配、特化
  • AtCoder AT_abc413_c [ABC413C] Large Queue 题解
  • Oracle 数据库——企业级核心系统
  • MySQL(118)如何使用SSL进行加密连接?
  • mysql的备份与恢复(使用mysqldump)
  • pyinstaller打包教程
  • TCP数据的发送和接收
  • 闲庭信步使用SV搭建图像测试平台:第三十一课——基于神经网络的手写数字识别
  • Ubuntu基础(监控重启和查找程序)
  • 模块三:现代C++工程实践(4篇)第一篇《C++模块化开发:从Header-only到CMake模块化》
  • Redis的编译安装
  • LabVIEW电阻率测试
  • LinkedList剖析
  • Kafka消息积压全面解决方案:从应急处理到系统优化
  • idea的使用小技巧,个人向
  • 类图+案例+代码详解:软件设计模式----适配器模式
  • 【电赛培训】运算放大器、滤波器
  • 使用 C++/OpenCV 和 MFCC 构建双重认证智能门禁系统
  • 堆的简单介绍
  • 智链万物:人工智能驱动的产业智能化革命
  • 使用 C++/Faiss 加速海量 MFCC 特征的相似性搜索
  • Python(28)Python循环语句指南:从语法糖到CPython字节码的底层探秘
  • 解决el-select数据类型相同但是显示数字的问题
  • 【Project】基于kafka的高可用分布式日志监控与告警系统
  • C#扩展方法全解析:给现有类型插上翅膀的魔法
  • CMake基础:条件判断详解
  • 探索 Ubuntu 上 MongoDB 的安装过程
  • [Cyclone] 哈希算法 | SIMD优化哈希计算 | 大数运算 (Int类)
  • 【大模型】到底什么是Function Calling和MCP,以及和ReAct推理的关系是什么?