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

Seata客户端@GlobalTransactional核心源码解析

文章目录

  • 前言
  • 一、@GlobalTransactional
    • 1.1、wrapIfNecessary
    • 1.2、handleGlobalTransaction
    • 1.3、invoke
  • 二、总结


前言

  Seata是阿里开源的分布式事务解决方案。在Spring传统的事务中,开启事务,执行事务,回滚/提交事务,统一由Spring进行管理,向数据库发起指令。而分布式事务中,分为了客户端(微服务端)和服务端(Seata)、注册中心(通常使用Nacos)这三个部分。Nacos提供了服务注册与发现,以及管理Seata配置的作用。无论是开启事务,执行事务,还是提交事务,都不是单个微服务内部自己决定的,而是统一向服务端发起请求,由服务端进行一系列的处理后,再向微服务端发起请求,驱动微服务端执行操作。


一、@GlobalTransactional

  对于微服务端,通常会在分布式事务的入口方法,加上@GlobalTransactional注解,表示该服务在分布式事务中作为TM的角色。微服务端的源码解析,自然要从该注解开始。
  在注解的注释上,标注了三个关键方法:
在这里插入图片描述

1.1、wrapIfNecessary

  使用Seata,在微服务端需要引入一个依赖:

        <!-- seata--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-seata</artifactId></dependency>

  通过自动配置机制,可以找到Seata客户端的核心类:
在这里插入图片描述
  在这个类中,装配了两个Bean:

  • FailureHandler:用于处理事务开始,执行,提交/回滚失败的情况,留给子类实现,发送邮件或通知告警。默认的实现DefaultFailureHandlerImpl则是进行日志记录。
  • GlobalTransactionScanner:是Seata的全局事务扫描器。

在这里插入图片描述
  GlobalTransactionScanner继承自AbstractAutoProxyCreator,重写了其关键方法wrapIfNecessary
在这里插入图片描述
  在wrapIfNecessary方法中,首先会判断当前模式是否为TCC,如果是TCC模式,创建TccActionInterceptor拦截器并设置清理任务,同时监听配置中心的开关DISABLE_GLOBAL_TRANSACTION
在这里插入图片描述
  否则就是AT模式,会检查目标类上是否存在@GlobalTransactional或方法上是否存在@GlobalTransactional@GlobalLock注解,如果存在,使用GlobalTransactionalInterceptor来代理。
在这里插入图片描述
  因为GlobalTransactionalInterceptor实现了MethodInterceptor接口,所以将创建出的GlobalTransactionalInterceptor实例赋值给MethodInterceptor类型的interceptor属性:
在这里插入图片描述


  判断是否存在@GlobalTransactional@GlobalLock注解,这一步非常关键,如果判断不通过,该类就不会做和Seata有关的增强。
在这里插入图片描述
existsAnnotation


  如果该Bean没有被代理过,则调用父类方法创建代理。如果已经是AOP代理,则动态插入Seata的Advisor。
在这里插入图片描述
  在super.wrapIfNecessary中,有一行关键代码getAdvicesAndAdvisorsForBean,目的是获取该 bean 适用的增强(Advice)或拦截器(Advisor),在Seata中选择图上的实现:

在这里插入图片描述
  如果是普通全局事务,就使用GlobalTransactionalInterceptor增强目标方法,执行其invoke方法。

在这里插入图片描述

wrapIfNecessary方法在Spring启动时,判断是否需要为 Bean 创建事务代理,并注入相应的拦截器(TCC 或 AT 模式)。

1.2、handleGlobalTransaction

  在1.1中,创建了GlobalTransactionalInterceptor的对象,其实现了MethodInterceptor
在这里插入图片描述
  在重写了MethodInterceptorinvoke方法中,如果当前方法上存在@GlobalTransactional注解,则会调用到handleGlobalTransaction方法:
在这里插入图片描述
  在handleGlobalTransaction方法中,首先会执行transactionalTemplateexecute方法:
在这里插入图片描述
  在执行execute方法的过程中,可能会发生异常,handleGlobalTransaction捕捉到异常后,会进行判断,如果当前是事务的参与者,也就是RM,则继续向上抛出异常,如果是事务的发起者TM,则解析出异常的code,执行各自失败的逻辑(SeataAutoConfiguration中注入的FailureHandler的逻辑)。
在这里插入图片描述
  这里的TransactionalTemplate,是seata的实现:在这里插入图片描述
  在execute方法中,首先会进行事务传播级别的判断,是否应该新开启一个事务,挂起当前事务等操作:Seata 的传播级别与 Spring 的传播语义一致,但实现机制完全不同,Spring 操作本地事务,Seata 操作的是全局分布式事务上下文。

在这里插入图片描述
  然后就会执行一套标准的事务流程:开启事务,执行事务,提交/回滚。
在这里插入图片描述

handleGlobalTransaction 方法代表了事务执行的整体流程。

1.3、invoke

  invoke是在AOP拦截到对原始DataSource的调用时,将调用路由到Seata的代理DataSource上,使得数据库连接支持全局事务的上下文控制。

  1. 判断拦截的方法是否为javax.sql.DataSource接口中定义的方法。
  2. 获取当前原始的DataSource,从DataSourceProxyHolde中获取其对应的SeataDataSourceProxy,最终将方法调用代理到 SeataDataSourceProxy 上。

在这里插入图片描述

Seata 使 SeataDataSourceProxy来增强连接的行为,如记录 UndoLog,绑定 XID,向 TC 注册分支事务

二、总结

Spring 容器启动时

  • GlobalTransactionScanner 会扫描所有 bean 的方法是否包含@GlobalTransactional@GlobalLock注解。
  • 如果有,就为该方法添加一个 AOP Advisor,代理增强逻辑就是 GlobalTransactionalInterceptor

方法执行时

  • Spring AOP 会调用 GlobalTransactionalInterceptor#invoke()
  • Seata 会根据事务传播级别、当前事务上下文,决定是否发起或加入全局事务。
  • 正常执行业务逻辑(调用 invocation.proceed())。
  • 执行完毕后:
    • 如果方法正常返回,Seata 提交全局事务;
    • 如果方法抛出异常,Seata 回滚事务
http://www.xdnf.cn/news/3313.html

相关文章:

  • Linux企业级分区设置
  • PEFT实战(三)——IA3参数高效微调
  • QT6 源(62)篇五:阅读与注释 QString 这个类,先给出官方综述,带一些翻译。总篇目太大,代码就有 2000 行
  • c++ 归并排序(分治)
  • 中国1km分辨率1901-2023年均气温降水数据
  • 2025年- H15-Lc123-41.缺失的第一个正数(普通数组)---java版
  • 格雷希尔用于工业气体充装站的CZ系列气罐充装转换连接器,其日常维护有哪些
  • linux jounery 日志相关问题
  • 高性能架构设计-分库分表
  • 声明:个人从未主动把文章设置为仅vip可读
  • 国内 AI 发展路线分析
  • /var/log/sssd/` 目录解析
  • 【Linux】gcc/g++配置
  • ROS2与Carla安装设备(其三)测试 ROS 2
  • 【MySQL数据库】事务
  • [第十五章][15.3.2 shellcode注入攻击]ret2shellcode+[NewStarCTF 公开赛赛道]ret2shellcode
  • LiP-MS与TPP联用:千金藤素在高尿酸血症中的抗神经炎症作用
  • 玩转Nginx
  • 极狐GitLab 分支管理功能介绍
  • ALLEGRO怎么外扩或内缩铜皮shape?
  • 美国国家生物技术信息中心NCBI介绍
  • 信号完整性简介第二篇
  • 2025A卷-传递悄悄话
  • 01_K近邻
  • Java 集合框架优化:从基础到高级应用
  • YPay标准版系统-五彩绚丽首页主题V1.0.0
  • 2025大模型应用爆发,算力保障成关键
  • 实用Chrome插件备忘
  • 科研 | 光子技术为人工智能注入新动力
  • PCB设计工艺规范(三)走线要求