分布式事务的
seata 核心源码分析
seata 底层通讯的信息是 使用的是netty 框架
client rm tm 端 创建的处理器是相应处理器 handler
server tc 端 创建的处理器是请求处理器 handler
根据消息的类型选择不同的消息处理器 handler
分布式事务的核心概念
tm rm tc
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 分支事务进行提交事务 删除分支事务 删除锁信息
回滚事务的操作