transactioninterceptor 是 spring 声明式事务的核心拦截器,本质为 methodinterceptor,通过 aop 代理触发,委托 platformtransactionmanager 处理事务开启、提交或回滚;其 invoke() 方法调用父类 transactionaspectsupport 的 invokewithintransaction() 执行事务模板逻辑,包括获取事务属性、获取/创建事务、执行业务并收尾;事务上下文依赖 transactionsynchronizationmanager 的 threadlocal 存储实现传播;仅代理对象调用生效,this 调用、private/final/static 方法及非 spring 管理 bean 均不生效。

TransactionInterceptor 是 Spring 声明式事务的核心拦截器,它本身不直接“做事务”,而是作为 AOP 链中的一环,在方法执行前后委托给 PlatformTransactionManager 完成真正的事务开启、提交或回滚。它的拦截逻辑本质上是标准的 Spring AOP 方法拦截流程,关键在于它如何与 TransactionAspectSupport 协同工作。
它本质是一个 MethodInterceptor,靠 AOP 代理触发
Spring 启用声明式事务(@EnableTransactionManagement)后,会注册 TransactionAttributeSourceAdvisor,该 Advisor 包含:
- 一个 TransactionAttributeSourcePointcut:匹配标注了
@Transactional的方法(或符合事务属性配置的方法) - 一个 TransactionInterceptor 实例:作为 advice,实际执行拦截逻辑
当目标方法被代理对象调用时(如 CGLIB 代理或 JDK 动态代理),AOP 框架按顺序执行拦截器链,TransactionInterceptor.invoke() 就会被调用。
核心逻辑在 invoke():模板方法 + 回调执行
TransactionInterceptor.invoke() 内部直接调用了父类 TransactionAspectSupport 的 invokeWithinTransaction() —— 这才是真正组织事务流程的方法。它大致分三步:
-
获取事务属性:通过
TransactionAttributeSource解析当前方法上的@Transactional注解(或 XML 配置),生成TransactionAttribute -
获取/创建事务:调用
PlatformTransactionManager.getTransaction(transactionAttribute),根据传播行为决定是新建事务、加入现有事务,还是不启用事务 -
执行业务 + 事务收尾:用 try-catch 包裹
proceedWithInvocation()(即真正执行目标方法)。成功则提交,抛出未被忽略的异常则回滚(依据 rollbackFor/noRollbackFor 规则)
事务上下文靠 ThreadLocal 传递
事务的“开启-传播-绑定”依赖 TransactionSynchronizationManager,它内部使用 ThreadLocal 存储:
-
currentTransactionStatus:当前事务状态(包含TransactionStatus对象) -
resources:绑定到当前线程的资源(如Connection、Session) -
synchronizations:注册的同步回调(如 commit 后清理缓存)
这样,同一调用链中的嵌套方法(即使跨多个 bean)只要在同一个线程,就能感知并复用外层事务,实现 PROPAGATION_REQUIRED 等传播行为。
不是所有调用都会被拦截,注意代理限制
TransactionInterceptor 只对通过代理对象发起的调用生效:
- 外部类调用 public @Transactional 方法 → ✅ 被拦截
- 本类内部 this.method() 调用 → ❌ 绕过代理,事务失效(无事务上下文)
- private / final / static 方法 → ❌ 不会被代理,注解无效
- 非 Spring 管理的 bean(new 出来的)→ ❌ 没有代理,不生效
这是 AOP 机制决定的,和 TransactionInterceptor 本身无关,但却是实际开发中最常见的“事务不生效”原因。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











