首先分享之前的所有文章 , 欢迎点赞收藏转发三连下次一定 >>>> 😜😜😜
文章合集 : 🎁 juejin.cn/post/694164…
Github : 👉 github.com/black-ant
一 . 前言
上一篇对 Session 的管理进行了了解 , 这一篇对其 SQL 的处理了解看看 , 相关的概念需要看一看上一篇 : 盘点 Seata : Server 端事务的 Session 初始化
整个 Session 的处理会分别对2个操作进行处理 , 一个为 global_table , 一个为 branch_table , 依次来说 :
Pro 1 : global_table 的作用
global_table 用于持久化全局事务 , 可以通过 store.db.global.table 进行配置
1 | java复制代码CREATE TABLE `global_table` ( |
Pro 2 : branch_table 的作用
branch_table 用于标识分支事务 , 可以通过 store.db.branch.table 进行配置
1 | java复制代码CREATE TABLE `branch_table` ( |
global_table 和 branch_table 是主事务和分支事务的关系 . 当一个业务运行时 , 会在 global_table 中创建一条数据 , 而每一个数据库操作单元 (RM 事务) , 都会创建一条 branch_table 数据.
二 . session 数据走向
来看一下整个流程的数据走向 , 先看一下整体的处理逻辑
1 | java复制代码C1- Netty Request 发起请求 |
2.1 Session 数据的入口
在上一篇文档中 , 已经了解到通过 DataBaseTransactionStoreManager # writeSession 开启了 Session 的处理
1 | java复制代码// 再来看一下 , 可以看到 , 每个 if 中都有一个具体的操作类型 , 主要分为 Global 和 Branch 2个部分 |
2.2 Session 数据的管理
Session 的管理通过 AbstractSessionManager 和 具体的对应类来实现 , AbstractSessionManager 中提供了如下的接口对 Session 进行处理
1 | java复制代码public interface SessionManager extends SessionLifecycleListener, Disposable { |
2.3 Session 的创建
当第一次业务执行的时候 , 就会发起 addGlobalSession 的逻辑流程 , Session 的创建是通过 SessionManager 创建
- C- AbstractTCInboundHandler # handle
- C- DefaultCoordinator # doGlobalBegin
- C- DefaultCore # begin
- C- GlobalSession # begin
- C- AbstractSessionManager # onBegin
- C- DataBaseSessionManager # addGlobalSession
1 | java复制代码// Step 临时 : onRequest |
2.4 Session 数据的使用
1 | java复制代码看完了管理 ,来看一下整个流程过程中 , 怎么实现 Session 的读取和使用流程 |
2.4.1 Session 的获取
Session 中通过 DataBaseSessionManager # readSession 发起 Session 的读取 , 其中提供了三种方法 :
- GlobalSession findGlobalSession(String xid)
- GlobalSession findGlobalSession(String xid, boolean withBranchSessions)
- List findGlobalSessions(SessionCondition condition) : 主要基于定时任务
1 | java复制代码 |
2.4.2 Session 的添加
1 | java复制代码 // 在Session 的创建后 ,后续 BranchSession 会加入 GlobalSession -> 详见 3.1.3 注册主逻辑 |
2.5 Session 数据的销毁
主要流程如下 :
- C- SessionHelper # endRollbacked
- C- GlobalSession # end()
- C- GlobalSession # onEnd()
- C- DataBaseSessionManager # removeGlobalSession
1 | java复制代码// DataBaseSessionManager |
三 . branch_table 流程
3.1 branch_table 的创建流程
3.1.1 注册入口
这里主要用到的是 AbstractTCInboundHandler , 这个类很重要 , Branch 逻辑均会由该类进行处理 , 该类存在一个实现类 : DefaultCoordinator
1 | java复制代码C- AbstractTCInboundHandler # handle |
3.1.2 doBranchRegister 注册主流程
每一个事务处理单元都会注册一个 Branch ,
1 | java复制代码C- DefaultCoordinator # doBranchRegister |
3.1.3 注册主逻辑
1 | java复制代码public Long branchRegister(BranchType branchType, String resourceId, String clientId, String xid, |
3.1.4 添加 Branch
1 | java复制代码public void addBranch(BranchSession branchSession) throws TransactionException { |
来看一下保存的数据结构
1 | java复制代码C- LogStoreDataBaseDAO |
五 . 其他环节补充
5.1 BranchSession 的删除
BranchSession 在 asyncCommit 逻辑中会对BranchSession 进行删除处理 , 主要流程如下 :
1 | java复制代码// Step 1 : asyncCommit 提交 globalCommit |
5.2 对比 Rollback 回退过程
和 Global 一样 , 异步的方式是不一样的
1 | java复制代码TODO : 后续完善 |
5.3 DefaultCoordinator 类简述
这里来看一下 DefaultCoordinator 类有什么 ?
1 | java复制代码 |
5.4 GlobalSession 是什么
当创建全局事务后 , 会创建 全局 Session , 实现SessionLifecycle接口,提供begin,changeStatus,changeBranchStatus,addBranch,removeBranch等操作session和branchSession的方法
- GlobalSessionLock : 该对象内部持有ReentrantLock对象,利用ReentrantLock的lock和unlock机制
- BranchSession : 分支session,管理分支数据,受globalSession统一调度管理,它的lock和unlock方法由lockManger实现
- DefaultLockManager : DefaultLockManager是LockManager的默认实现,它获取branchSession的lockKey
说一说 lifecycleListeners 的作用
private Set lifecycleListeners = new HashSet<>()
在不同的方法中 , 会分别循环 Listeners 调用对应的逻辑
- begin() -> lifecycleListener.onBegin(this)
- changeStatus(GlobalStatus status) -> lifecycleListener.onStatusChange(this, status)
- changeBranchStatus(BranchSession branchSession, BranchStatus status) -> lifecycleListener.onBranchStatusChange(this, branchSession, status)
- close() -> lifecycleListener.onClose(this)
- end() -> lifecycleListener.onEnd(this)
SessionLifecycleListener 模块
可以看到 , 主要有3种实现 , DataBaseSessionMananger , FileSessionManager , RedisSessionManager
他们分别会对应各自的 Store 管理器 :
FileSessionManager -> FileTransactionStoreManager
RedisSessionManager -> RedisTransactionStoreManager
DataBaseSessionManager -> DataBaseTransactionStoreManager
5.5 主逻辑流程图
总结
文章内容比较简单 , 主要是为了完善整个 Seata 的版图 , 算是梳理个七七八八了
后续再把 undo-log 梳理完 , 整个流程就差不多可以结束了
等 Seata 完成了单纯得源码分析也可以告一段落了 , 后续慢慢的要开启应用篇 , 拭目以待
本文转载自: 掘金