这是我参与更文挑战的第18天,活动详情查看: 更文挑战
首先分享之前的所有文章 , 欢迎点赞收藏转发三连下次一定 >>>> 😜😜😜
文章合集 : 🎁 juejin.cn/post/694164…
Github : 👉 github.com/black-ant
一 .前言
前面说了 Seata Client 的请求流程 , 这一篇从 Session 的处理来看一下 Seata Server 端的处理 .
每一次 Seata 的全局操作都会创建一个 Session , 并且往表中插入事务数据.
二 . global_table 表
先来看一下 global_table 的表结构
1 | java复制代码CREATE TABLE `global_table` ( |
三 . Server Session 处理一览
我们通过启动参数 -m 对请求 STORE_MODE 进行配置 : seata-server.bat -m db
整个 Session 的处理会分别对2个操作进行处理 , 一个为 global_table , 一个为 branch_table , 依次来说 :
Pro 1 : global_table 的作用
global_table 用于持久化全局事务 , 可以通过 store.db.global.table 进行配置
Pro 2 : branch_table 的作用
branch_table 用于标识分支事务 , 可以通过 store.db.branch.table 进行配置
数据结构
1 | sql复制代码# C- LogStoreDataBaseDAO # insertGlobalTransactionDO : 插入 global_table |
3.1 global_table 的处理流程
配置 STORE_MODE 为 db 后 , 会使用 DataBaseSessionManager 和 DataBaseTransactionStoreManager 进行业务的处理
1 | java复制代码// 创建的调用入口 (此处忽略前置逻辑 , 但从 Session 的创建开始) |
从 Step 1 中可以看到 , 添加时会调用 writeSession , 这是个很重要的方法 , 基本上所有的编辑session 操作都会经历该类 , 可以通过 Debug 该部分
1 | java复制代码/** |
[Pro31001] : logOperation 的作用和来源
LogOperation 作用 :
LogOperation 是一个枚举类 , 用于表示操作的类型
1 | java复制代码enum LogOperation { |
LogOperation 的来源:
在调用该流程的时候 , 会传入对应的 LogOperation.code . 例如 DataBaseSessionManager 操作中
1 | java复制代码 |
3.2 branch_table 的处理逻辑
1 | java复制代码//======== 以下是 Beanch 逻辑 |
四 . Session 的初始化流程
4.1 Session 的初始化
Step 1 : 启动入口 Server # main , 其中会开启 Session
1 | js复制代码// 在 server # main 启动方法中 , 会调用以下语句 |
Step 2 : SessionHolder init 流程
C- SessionHolder # init 中进行了如下操作 :
- 获得配置的 store.mode , 从下面得代码可以看到支持 DB , FILE , REDIS
- 通过 EnhancedServiceLoader#load 加载 SessionManager
1 | js复制代码public static void init(String mode) { |
Step 3 : InnerEnhancedServiceLoader 加载的方式
1 | js复制代码public static <S> S load(Class<S> service, String activateName) throws EnhancedServiceNotFoundException { |
[PRO:] InnerEnhancedServiceLoader 的作用 ?
1 | java复制代码InnerEnhancedServiceLoader 是 EnhancedServiceLoader 的内部类 : |
PIC30001 : META-INF.service 数据
Step 4 : 指定classLoader来加载 server provider
该单元是主要的处理流程 , 用于
1 | java复制代码C- EnhancedServiceLoader |
Step 5 : loadAllExtensionClass 从配置文件中获取所有的 Extension
1 | java复制代码C- EnhancedServiceLoader |
Step 6 : getCachedExtensionDefinition 获取 BeanDefinition 基础信息
1 | java复制代码// 比较简单 , 就是获取 ConcurrentMap<String, List<ExtensionDefinition>> nameToDefinitionsMap |
Step 7 : 反射进行初始化
1 | js复制代码// 发起流程 : |
Step 7-1 : DataBaseSessionManager 中 init 操作
其中关于 DataBase 会使用 DataBaseSessionManager 操作 , 这一块看一下整体的体系 :
1 | java复制代码public void init() { |
Step 7-2 : 构造器操作
1 | java复制代码 |
Step 8 : reload 刷新 SessionManager
在执行完上述逻辑后还没完全 , 注意 Step 2 中最后还有个 Reload 操作 ,该操作会继续处理 DataBaseSessionManager
1 | java复制代码c- SessionHolder |
[Pro] : Reloadable 对象体系
1 | java复制代码public interface Reloadable { |
五 . 扩展知识点
5.1 LoadLevel 的作用
@LoadLevel(name = "file", scope = Scope.PROTOTYPE)
1 | java复制代码 |
总结
LoadLevel 和 MATA-INF 真正的作用是用于扩展不同的数据库 , 后续等 seata 梳理完成后 , 再来看一下如何进行定制.
自此 Session 的处理类初始化完成 , 后面来看一下 Session 在调用过程中的处理和数据库处理
本文转载自: 掘金