分布式事务的
    seata 核心源码分析

    1. seata 底层通讯的信息是 使用的是netty 框架
    2. client rm tm 端 创建的处理器是相应处理器 handler
    3. server tc 端 创建的处理器是请求处理器 handler
    4. 根据消息的类型选择不同的消息处理器 handler
    5. 分布式事务的核心概念
    6. tm rm tc
    7. at tcc

    Tm 和 Rm 服务注册的过程
    spring.factory 配置文件 入口
    GloableTransationalScanner 类 实现了 InitalizingBean 生命周期 接口
    initClient
    RmInitClient init
    TmInitClient init
    RmNettyRemotingClient
    TmNettyRemotingClient 和 Tc (server端)进行通讯
    设置客户端处理器 获取连接 添加管道处理器

    server 源码分析
    Server 类 main 方法
    设置日志存储方式 file redis mysql
    注册处理器 handler
    tm rm 注册源码
    程序启动时间 client 向 server 发动请求完成注册 initclient

    核心概念: 事务分组 (配置文件进行配置)
    创建链接对象: client to server
    创建netty 通道管理器
    构建信息对象 发送注册信息
    注册处理器 handler 真实干活的类信息
    拉去注册信息从nacos 中

    tm 开启全局事务的过程源码
    开启全局事务
    自动代理器 abstractautoproxycreator 拦截器
    开启全局事务 向server 发送请求 type = 1
    管理本地事务
    (只要有一个本地事务提交失败就是全局事务回滚 / 全部的本地事务提交成功全局事务执行事务提交操作)
    1 提交事务type =7
    2 回滚事务 type=9 向tc 发送请求
    server 向client 发送请求 执行事务提交或者回滚操作
    tm(本地事务)
    代理方法本质上操作的就是 mysql 连接的connection 对象
    被添加@globaltransactional 的方法都会被动态代理 wrapifnecessary() GlobalTranctionalInterceptor
    创建全局事务
    处理事务的传播
    开启全局事务
    server 向 MySQL 表中添加一条事务的session信息 将sessionid 和基础信息返回给 client tm 端
    rm(和seata server 进行通讯的 client)分支事务的注册
    在执行sql 语句的时间的操作
    判断是不是全局的事务 根据事务xid(全局事务id ) 是否存在
    生成前置镜像信息 生成后置镜像信息 prepareUndoLog
    提交事务 注册分支事务 和tc 进行通讯 设置分支回话锁 添加分支
    将全局事务xid 绑定到上下文中 -》将xid 传递到 feignclient 的调用的下游服务中
    seatafeignclient getModifyRequest(修改request 信息 修改请求头信息 绑定xid 最终会绑定到threadlocal 对象中)
    代理数据源
    seata 通过数据库进行管理 重要的三张表信息 global_table(全局事务的管理) banch_table(分支事务的管理) lock_table (事务的锁信息)
    undolog 表信息 在每个分支数据库中都会有这样的一张表 用来回滚事务
    tm rm 事务提交的源码分析
    server 通知client 分支事务进行提交事务 删除分支事务 删除锁信息
    回滚事务的操作