
Java技术面试高频题整理报告 今日知识点Spring事务底层原理与高频考点一、知识点核心概述Spring事务是Java后端开发中最核心的面试考点之一也是生产环境中最容易出问题的模块。掌握Spring事务不仅需要理解AOP动态代理的表层概念更需要深入理解声明式事务与编程式事务的选型差异、事务传播机制的底层实现、以及事务失效的十大经典场景 。二、核心概念深度解析1. Spring事务的两种实现方式实现方式实现原理优点缺点适用场景编程式事务通过TransactionTemplate或PlatformTransactionManager手动控制事务边界灵活性高可精确控制代码块级别的事务边界代码侵入性强业务代码中掺杂事务管理逻辑可读性差需要精细控制事务边界的特殊场景声明式事务通过Transactional注解AOP实现零侵入业务代码纯净事务逻辑与业务逻辑解耦最细粒度只能到方法级别绝大多数业务场景推荐首选编程式事务代码示例Autowired private TransactionTemplate transactionTemplate; public void executeWithTx() { transactionTemplate.execute(status - { userDao.insert(user); orderDao.insert(order); return null; }); }声明式事务代码示例Transactional(rollbackFor Exception.class, propagation Propagation.REQUIRED) public void executeWithTx() { userDao.insert(user); orderDao.insert(order); }2. 声明式事务启动链路EnableTransactionManagement注解通过Import向Spring容器注册两个关键组件 AutoProxyRegistrar启用AOP自动代理功能注册InfrastructureAdvisorAutoProxyCreatorProxyTransactionManagementConfiguration注册事务拦截器配置动态代理选择逻辑public AopProxy createAopProxy(AdvisedSupport config) { if (config.isOptimize() || config.isProxyTargetClass() || hasNoUserSuppliedProxyInterfaces(config)) { Class? targetClass config.getTargetClass(); if (targetClass.isInterface() || Proxy.isProxyClass(targetClass)) { return new JdkDynamicAopProxy(config); // JDK动态代理 } return new ObjenesisCglibAopProxy(config); // CGLIB代理 } return new JdkDynamicAopProxy(config); }3. 事务传播机制七大类型传播行为含义典型场景REQUIRED默认如果当前存在事务则加入该事务否则创建新事务大多数业务场景SUPPORTS支持当前事务如果当前没有事务就以非事务方式执行查询操作REQUIRES_NEW创建新事务如果当前存在事务则把当前事务挂起需要独立事务的场景NESTED如果当前存在事务则在嵌套事务内执行部分提交场景MANDATORY如果当前存在事务则加入该事务否则抛出异常强制要求事务的场景NOT_SUPPORTED以非事务方式执行操作如果当前存在事务则把当前事务挂起不需要事务的场景NEVER以非事务方式执行如果当前存在事务则抛出异常禁止事务的场景传播机制底层实现通过ThreadLocal维护当前线程的事务上下文TransactionSynchronizationManager中的resources ThreadLocalMap 。4. 事务回滚规则关键陷阱默认情况下只有RuntimeException和Error会触发回滚checked Exception如IOException、SQLException不会回滚异常类型默认行为解决方案RuntimeException自动回滚无需配置Error自动回滚无需配置Checked Exception不会回滚需显式配置rollbackFor Exception.class三、高频面试题目及答案解析 题目1Spring事务的底层原理是什么参考答案Spring事务基于AOP动态代理实现。当调用带有Transactional注解的方法时实际执行的是TransactionInterceptor.invoke()其内部调用invokeWithinTransaction()完成事务全生命周期管理 解析注解属性通过TransactionAttributeSource解析Transactional注解配置获取/创建事务调用PlatformTransactionManager.getTransaction()根据传播行为获取或创建事务核心是将数据库连接绑定到ThreadLocal执行业务方法调用proceedWithInvocation()执行目标方法提交或回滚根据异常类型决定提交commitTransactionAfterReturning()或回滚completeTransactionAfterThrowing() 题目2Spring事务失效的常见场景有哪些参考答案事务失效的七大经典场景 方法非public修饰Transactional只能应用于public方法同类内部方法调用绕过AOP代理直接调用目标方法异常被try-catch捕获未抛出异常事务拦截器无法感知事务传播机制配置错误如使用NOT_SUPPORTED多线程环境下事务互不感知事务基于ThreadLocal多线程无法共享数据库引擎不支持事务如MySQL的MyISAM引擎只读事务、超时触发事务回滚机制失效 题目3JDK动态代理和CGLIB代理有什么区别参考答案对比维度JDK动态代理CGLIB代理实现原理基于接口实现基于子类继承实现使用限制目标类必须实现接口可代理任意普通类性能差异低版本JDK中性能较差低版本JDK中性能更优Spring默认规则SpringBoot 2.0默认使用CGLIB无接口类自动选用CGLIB局限性无接口无法代理无法代理final、private、static方法 题目4Spring如何解决循环依赖问题参考答案Spring通过三级缓存机制解决单例Setter/字段注入循环依赖问题 一级缓存存放完整初始化完成的单例Bean二级缓存存放已实例化、未完全初始化的Bean实例三级缓存存放Bean工厂对象提前暴露Bean引用核心原理提前暴露未完成初始化的Bean引用打破循环依赖闭环。注意构造器注入循环依赖无法解决会直接报错 。四、常见误区与避坑指南❌ 误区1认为Transactional注解可以作用于任何方法真相Transactional只能作用于public方法非public方法会导致事务失效 。❌ 误区2认为所有异常都会触发事务回滚真相默认只有RuntimeException和Error会回滚checked Exception需要显式配置rollbackFor。❌ 误区3认为同类内部调用也能触发事务真相同类内部方法调用会绕过AOP代理直接调用目标方法导致事务失效 。解决方案通过AopContext.currentProxy()获取代理对象或注入自身Bean调用。五、生产环境最佳实践优先使用声明式事务绝大多数场景使用Transactional代码更简洁显式配置rollbackFor始终配置rollbackFor Exception.class避免checked异常不回滚避免同类内部调用需要事务增强时通过注入自身Bean或AopContext调用注意多线程场景事务基于ThreadLocal多线程环境下需要特殊处理合理选择传播机制根据业务场景选择合适的传播行为避免不必要的事务嵌套六、延伸学习建议根据Java面试通关系列的20篇核心知识点规划建议按以下顺序系统学习 Day 1-10核心基础Java基础、集合、并发、JVM重点掌握HashMap源码、synchronized锁升级、GC回收机制Day 11-15主流框架Spring、SpringBoot、MyBatis重点掌握Bean生命周期、循环依赖解决、AOP原理Day 16-20中间件与架构Redis、MySQL、MQ、分布式重点掌握缓存三兄弟、MySQL索引失效、Seata分布式事务七、今日总结Spring事务是Java后端面试的必考核心考点也是生产环境中的高频问题来源。掌握Spring事务需要理解声明式事务与编程式事务的选型差异深入掌握七大传播机制的底层实现ThreadLocal绑定熟记事务失效的十大经典场景明确回滚规则的精确语义默认仅回滚RuntimeException/Error建议结合源码阅读和实际项目演练真正打通从面试造火箭到工作拧螺丝的最后一公里 。参考来源《Java面试通关系列》终极复盘从“背诵答案”到“系统精通”-CSDN博客【Java实习面试算法冲刺】栈、队列与单调栈-CSDN博客Java面试通关⑭分布式理论与架构全集-CSDN博客第7篇工厂模式面试高频题与避坑指南-CSDN博客Java面试通关⑧Spring核心IoC/AOP全集-CSDN博客【大白话说Java面试题 第159题】【06_Spring篇】第19题 Spring事务底层原理-CSDN博客