Seata 的 @GlobalTransactional 通过 Spring AOP 切面与反射扫描实现:启动时 GlobalTransactionScanner 扫描 Spring Bean 中标注该注解的 public 方法并标记代理;运行时 GlobalTransactionalInterceptor 拦截方法,调用 begin/commit/rollback 并借助 RootContext 和 DefaultTransactionManager 管理事务上下文与 TC 通信。

Seata 的 @GlobalTransactional 是通过 Spring AOP 切面 + Java 反射扫描实现的,核心在于拦截标注该注解的方法,在调用前开启全局事务(TC 注册),调用后根据结果提交或回滚。
反射扫描:定位被 @GlobalTransactional 标注的方法
Seata 依赖 Spring 的 BeanPostProcessor 和 ClassPathScanningCandidateComponentProvider(或更常用的是直接利用 Spring 的 Advisor 机制)来发现目标方法。实际流程中,并不单独做“全量反射扫描”,而是:
- Spring 容器启动时,Seata 的
GlobalTransactionScanner作为BeanPostProcessor被注册; - 它遍历所有 Bean,对每个 Bean 的类和方法调用
AnnotationUtils.findAnnotation(method, GlobalTransactional.class); - 若方法上存在该注解,就将该 Bean 的对应方法加入代理候选列表(本质是标记需增强);
- 注意:Seata 不扫描 classpath 下所有类,只扫描 Spring 管理的 Bean,避免性能损耗。
切面织入:基于 Spring AOP 的 Around Advice 拦截
Seata 提供了 GlobalTransactionalInterceptor,它实现了 MethodInterceptor,并被注册为 Spring AOP 的 Advisor。当代理对象执行被注解的方法时:
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
- 拦截器在方法执行前调用
beginTransaction(),向 TC 发起全局事务创建请求,获取xid; - 将
xid绑定到当前线程(RootContext.bind(xid)),后续 RPC 或 DB 操作可通过该上下文透传; - 方法正常返回后,调用
commitTransaction();异常则触发rollbackTransaction(); - 整个过程由 Spring 的
ProxyFactoryBean或AspectJAutoProxyCreator自动完成代理生成,无需手动编码。
关键支撑:RootContext 与 TransactionManager
事务上下文和远程协调靠两个核心组件协作:
-
RootContext是一个ThreadLocal工具类,负责在当前线程存取xid,保证事务上下文在方法链、线程池、异步调用中不丢失(需配合 Seata 提供的AsyncTaskWrapper或手动传递); -
DefaultTransactionManager封装了与 TC(Transaction Coordinator)通信的逻辑,通过 Netty 客户端发送 Begin/Commit/Rollback 请求; - 这些能力在
GlobalTransactionalInterceptor中被组合使用,而非直接暴露给业务代码。
注意事项与常见误区
实际使用中容易忽略的细节:
- 必须确保目标方法是 Spring 管理的 Bean 的 public 方法(private / static / final 方法无法被代理);
- 同一类内方法自调用(this.method())不会触发切面,因为绕过了代理对象;
- 事务传播行为默认是
Propagation.REQUIRED,嵌套调用时复用已有全局事务,不是新建; - 如果使用 Dubbo 或 Feign,需集成 Seata 对应的适配模块(如
seata-dubbo),才能透传xid。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










