0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

浅谈Seata 源码

京东云 ? 来源:京东物流 张士欣5 ? 作者:京东物流 张士欣 ? 2025-01-20 10:15 ? 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

作者:京东物流 张士欣

核心接口和类

ResourceManager

ResourceManager 是 seata 的重要组件之一,RM 负责管理分支数据资源的事务。

AbstractResourceManager 实现 ResourceManager 提供模板方法。DefaultResourceManager 适配所有的 ResourceManager,所有方法调用都委派给对应负责的 ResourceManager 处理。

DataSourceManager

此为 AT 模式核心管理器,DataSourceManager 继承 AbstractResourceManager,管理数据库 Resouce 的注册,提交以及回滚等。

AsyncWorker

DataSourceManager 事务提交委派给 AsyncWorker 进行提交的,因为都成功了,无需回滚成功的数据,只需要删除生成的操作日志就行,采用异步方式,提高效率。

io.seata.rm.datasource.AsyncWorker#doBranchCommits
UndoLogManagerFactory.getUndoLogManager(dataSourceProxy.getDbType()).batchDeleteUndoLog(xids, branchIds, conn);

UndoLogManager

TransactionManager

DefaultTransactionManager

TransactionManagerHolder 为创建单例 TransactionManager 的工厂,可以使用 EnhancedServiceLoader 的 spi 机制加载自定义的类,默认为DefaultTransactionManager。

GlobalTransaction

GlobalTransaction 接口提供给用户开启事务,提交,回滚,获取状态等方法。

DefaultGlobalTransaction

DefaultGlobalTransaction 是 GlobalTransaction 接口的默认实现,它持有 TransactionManager 对象,默认开启事务超时时间为 60 秒,默认名称为 default,因为调用者的业务方法可能多重嵌套创建多个 GlobalTransaction 对象开启事务方法,因此 GlobalTransaction 有 GlobalTransactionRole 角色属性,只有Launcher 角色的才有开启、提交、回滚事务的权利。

GlobalTransactionContext

GlobalTransactionContext 为操作 GlobalTransaction 的工具类,提供创建新的 GlobalTransaction,获取当前线程有的 GlobalTransaction 等方法。

GlobalTransactionScanner

GlobalTransactionScanner 继承 AbstractAutoProxyCreator 类,即实现了 SmartInstantiationAwareBeanPostProcessor 接口,会在 spring 容器启动初始化bean 的时候,对 bean 进行代理操作。wrapIfNecessary 为继承父类代理 bean 的核心方法,如果配置了 service.disableGlobalTransaction 为 false 属性则注解不生效直接返回,否则对 GlobalTransactional 或 GlobalLock 的方法进行拦截代理。

GlobalTransactionalInterceptor

GlobalTransactionalInterceptor 实现 aop 的 MethodInterceptor 接口,对有 @GlobalTransactional 或 GlobalLock 注解的方法进行代理。

TransactionalTemplate

TransactionalTemplate 模板类提供了一个开启事务,执行业务,成功提交和失败回滚的模板方法 execute(TransactionalExecutor business)。

try {
    // 2. If the tx role is 'GlobalTransactionRole.Launcher', send the request of beginTransaction to TC,
    //    else do nothing. Of course, the hooks will still be triggered.
    beginTransaction(txInfo, tx);

    Object rs;
    try {
        // Do Your Business
        rs = business.execute();
    } catch (Throwable ex) {
        // 3. The needed business exception to rollback.
        completeTransactionAfterThrowing(txInfo, tx, ex);
        throw ex;
    }

    // 4. everything is fine, commit.
    commitTransaction(tx);

    return rs;
} finally {
    //5. clear
    resumeGlobalLockConfig(previousConfig);
    triggerAfterCompletion();
    cleanUp();
}

Resource

Resource 能被 ResourceManager 管理并且能够关联 GlobalTransaction。

DataSourceProxy

DataSourceProxy 实现 Resource 接口,BranchType 为 AT 自动模式。它继承 AbstractDataSourceProxy 代理类,所有的 DataSource 相关的方法调用传入的targetDataSource 代理类的方法,除了创建 connection 方法为创建 ConnectionProxy 代理类。对象初始化时获取连接的 jdbcUrl 作为 resourceId,并注册至DefaultResourceManager 进行管理。同时还提供获取原始连接不被代理的 getPlainConnection 方法。

ExecuteTemplate

ExecuteTemplate 为具体 statement 的 execute,executeQuery 和 executeUpdate 执行提供模板方法。

Executor

SQLRecognizer

SQLRecognizer 识别 sql 类型,获取表名,表别名以及原生 sql

UndoExecutorFactory

UndoExecutorFactory 根据 sqlType 生成对应的 AbstractUndoExecutor。

UndoExecutor 为生成执行 undoSql 的核心。如果全局事务回滚,它会根据 beforeImage 和 afterImage 以及 sql 类型生成对应的反向 sql 执行回滚数据,并添加脏数据校验机制,使回滚数据更加可靠。

DefaultCoordinator

DefaultCoordinator 即为 TC,全局事务默认的事务协调器。它继承 AbstractTCInboundHandler 接口,为 TC 接收 RM 和 TM 的 request 请求数据,是进行相应处理的处理器。实现 TransactionMessageHandler 接口,去处理收到的 RPC 信息。实现 ResourceManagerInbound 接口,发送至 RM 的 branchCommit,branchRollback 请求。

Core

Core 接口为 seata 处理全局事务协调器 TC 的核心处理器,它继承 ResourceManagerOutbound 接口,接受来自 RM 的 rpc 网络请求 (branchRegister,branchReport,lockQuery)。同时继承 TransactionManager 接口,接受来自 TM 的 rpc 网络请求(begin, commit,rollback,getStatus),另外提供提供 3 个接口方法。

GlobalSession

GlobalSession 是 seata 协调器 DefaultCoordinator 管理维护的重要部件,当用户开启全局分布式事务,TM 调用 begin 方法请求至 TC,TC 则创建GlobalSession 实例对象,返回唯一的 xid。它实现 SessionLifecycle 接口,提供 begin,changeStatus,changeBranchStatus,addBranch,removeBranch 等操作 session 和 branchSession 的方法。

BranchSession

BranchSession 为分支 session,管理分支数据,受 globalSession 统一调度管理,它的 lock 和 unlock 方法由 lockManger 实现。

LockManager

DefaultLockManager 是 LockManager 的默认实现,它获取 branchSession 的 lockKey,转换成 List,委派 Locker 进行处理。

Locker

Locker 接口提供根据行数据获取锁,释放锁,是否锁住和清除所有锁的方法。

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 源码
    +关注

    关注

    8

    文章

    672

    浏览量

    30384
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    PCB经验浅谈

    PCB经验浅谈
    发表于 08-04 09:33

    手机硬件知识浅谈

    手机硬件知识浅谈
    发表于 05-15 11:04

    手机机构设计浅谈

    手机机构设计浅谈
    发表于 11-13 11:21

    浅谈射频PCB设计

    浅谈射频PCB设计
    发表于 03-20 15:07

    浅谈移动端相关概念

    浅谈移动端适配
    发表于 04-16 11:52

    浅谈FPGA在安全产品中有哪些应用?

    浅谈FPGA在安全产品中有哪些应用?
    发表于 05-08 06:36

    什么是数码功放?浅谈数码功放

    什么是数码功放?浅谈数码功放
    发表于 06-07 06:06

    浅谈计算机的硬件维护

    软件系统的同时,也应该重视对于计算机硬件的维护。以下是小编为大家精心准备的:浅谈计算机的硬件维护相关论文。内容仅供参考,欢迎阅读!浅谈计算机的硬件维护全文如下:摘要: 现今科技的进步日新月异,计算机作为信息时...
    发表于 09-08 07:52

    浅谈三层架构原理

    浅谈三层架构原理
    发表于 01-16 09:14

    浅谈HAL库uart数据收发与部分源码

    HAL 库uart 数据收发与部分源码介绍提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加例如:第一章 Python 机器学习入门之pandas的使用提示:写完文章后,目录可以自动
    发表于 01-21 07:31

    浅谈ADC按键的应用设计

    浅谈ADC按键的应用设计(现代电源技术pdf王建辉)-浅谈ADC按键的应用设计? ? ? ? ??
    发表于 09-17 13:37 ?25次下载
    <b class='flag-5'>浅谈</b>ADC按键的应用设计

    从代码角度详解Seata AT事务模式的流程

    Seata 四种事务模式中,AT 事务模式是阿里体系独创的事务模式,对业务无侵入,也是 Seata 用户最多的一种事务模式,兼具易用性与高性能。
    的头像 发表于 09-29 10:08 ?1476次阅读

    AOSP Android11系统源码和内核源码简析

    AOSP源码中并不包括内核源码,需要单独下载,内核源码有很多版本,比如common是通用的Linux内核,msm是用于使用高通MSM芯片的Android设备,goldfish是用于Android模拟器的内核
    的头像 发表于 01-29 09:25 ?6712次阅读

    Java算法大全源码包开源源码

    Java算法大全源码包开源源码
    发表于 06-07 14:58 ?1次下载

    保姆级教程:Spring Cloud 集成Seata分布式事务

    Seata1.5.0版本直接是一个SpringBoot项目,下载后修改application.yml 文件中注册中心、配置中心、存储模式配置。参考resources/application.example.yml 文件 ,修改后如下
    的头像 发表于 06-09 14:42 ?1845次阅读
    保姆级教程:Spring Cloud 集成<b class='flag-5'>Seata</b>分布式事务