当前位置: 首页 > 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.dtcms.com/a/267455.html

相关文章:

  • Flink-Source算子状态恢复分析
  • 机器视觉对位中的常见模型与技术原理
  • HTML网页应用打包Android App 完整实践指南
  • 【Project】基于kafka的高可用分布式日志监控与告警系统
  • openstack安装并初始化
  • 智能自主运动体的革命:当AI学会奔跑与协作 ——从单机定位到群体智能的跨越
  • 2025年的前后端一体化CMS框架优选方案
  • 未来趋势:AI与量子计算对服务器安全的影响
  • 博弈论基础-笔记
  • RTX5可以在中断中调用的API
  • 08_容器化与微服务:构建弹性架构
  • Ubuntu 22.04 修改默认 Python 版本为 Python3 笔记
  • Hbase2.6.2集群部署(最新版)
  • spring-initializer
  • OneCode MQTT插件开发实战:基于Paho.Client的物联网通信解决方案
  • python使用fastmcp包编写mcp服务端(mcp server)
  • ServiceNow CAD项目实战详细解析
  • PPT文字精简与视觉化技巧
  • StarRocks × Tableau 连接器完整使用指南 | 高效数据分析从连接开始
  • Eureka和Nacos都可以作为注册中心,它们之间的区别
  • DIODON HP30 防水充气无人机:海上侦察的创新利器
  • 进阶篇:18-使用 Kaniko 在无 Docker Daemon 环境中构建镜像
  • 《数据维度的视觉重构:打造交互式高维数据可视化的黄金法则》
  • 告别 undefined is not a function:TypeScript 前端开发优势与实践指南
  • 缓存解决方案
  • vuedraggable在iframe中无法使用问题
  • MySQL基础和 表的‘CRUD’(基础版)
  • 基础数据结构第04天:单向链表(概念篇)
  • ubuntu手动编译VTK9.3 Generating qmltypes file 失败
  • 解决URL编码兼容性问题:空格转义与HTML实体解码实战