分布式事务的
    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 分支事务进行提交事务 删除分支事务 删除锁信息
    回滚事务的操作