这是我参与更文挑战的第15天,活动详情查看: 更文挑战
首先分享之前的所有文章 , 欢迎点赞收藏转发三连下次一定 >>>> 😜😜😜
文章合集 : 🎁 juejin.cn/post/694164…
Github : 👉 github.com/black-ant
一 . 前言
前面一篇说了 AT 模式中到 Template 的所有流程 , 这一篇来看一下后面的 begiunTransaction 做了什么
二 . 流程梳理
流程分为几个节点 :
- 属性部分 : TransactionInfo + GlobalLockConfig
- 事务部分 : beginTransaction + commitTransaction
- 逻辑部分 : execute + TransactionalExecutor
2.1 TransactionInfo 详情
1 | java复制代码> PS:M52_02_01 TransactionInfo 对象包含了什么? |
Propagation 的作用 ?
Propagation 是一个枚举 , 表示的是事务传播的模式 , 包括如下几种 :
- REQUIRED : 如果事务存在,则使用当前事务执行,否则使用新事务执行
- REQUIRES_NEW : 如果事务存在,将暂停它,然后使用新事务执行业务。
- NOT_SUPPORTED : 如果事务存在,则挂起它,然后执行没有事务的业务
- SUPPORTS : 如果事务不存在,则不执行全局事务,否则执行当前事务的业务
- NEVER : 如果事务存在,抛出异常,否则执行没有事务的业务
- MANDATORY: 如果事务不存在,抛出异常,否则执行与当前事务相关的业务
2.2 GlobalLockConfig 详情
对象属性 :
1 | java复制代码// 再次回顾一下之前看过的对象 |
逻辑处理:
1 | java复制代码 |
[Pro] : 为什么关键二中 , 获取得是之前的 Config
获取前一个 GlobalLockConfig 主要是用于回退
1 | java复制代码GlobalLockConfig previousConfig = replaceGlobalLockConfig(txInfo); |
那么问题来了 ,我都已经到了下一个操作了 ,再获取前一个全局锁是为什么 ?
大概想了一下 , 主要应该是这样的流程 , 当第一个事务获取全局锁时 , 其他本地事务如果要执行 ,必须获取全局锁 , 那么 , 下一个事务应该去关注上一个全局锁配置.
因为上一个全局锁未处理完的情况下 , 下一个事务实际上是拿不到一个全局锁的.
1 | java复制代码private void resumeGlobalLockConfig(GlobalLockConfig config) { |
PS : 不知道这里理解得对不对 ,因为这里ThreadLocal 获取到的是当前线程的配置 , 即一个线程内我的全局锁唯一吗?
TODO : 后文看全局锁的时候再来回顾一下
2.3 beginTransaction 开启事务
上文看完了配置信息 , 这里来看一下事务的启动
1 | java复制代码// 其中可以看到 , 主要是3步走 >>> |
2.3.1 triggerBeforeBegin()
1 | java复制代码// 先来看一下 trigger 主要逻辑 |
2.3.2 DefaultGlobalTransaction # begin 处理
继续来看三步中的核心步骤 : tx.begin(txInfo.getTimeOut(), txInfo.getName())
1 | java复制代码C52- DefaultGlobalTransaction |
PS : RootContext 是什么 ?
RootContext 是根上下文 ,它会当当前 XID 进行管理
1 | java复制代码C- RootContext |
2.3.3 TransactionManager 详情
1 | java复制代码// 这里终于使用 TransactionManager 进行相关的管理了 |
GlobalBeginRequest 与 GlobalBeginResponse 详情
2.3.4 远程调用
远程调用分为2步 :
- Step 1 : syncCall 发起远程调用主逻辑
- Step 2 : sendSyncRequest(Object msg) 正式的调用
Step 1 : syncCall 发起远程调用主逻辑
1 | java复制代码private AbstractTransactionResponse syncCall(AbstractTransactionRequest request) throws TransactionException { |
Step 2 : sendSyncRequest(Object msg) 正式的调用
1 | java复制代码 public Object sendSyncRequest(Object msg) throws TimeoutException { |
2.4 commitTransaction 提交事务
1 | java复制代码private void commitTransaction(GlobalTransaction tx) throws TransactionalExecutor.ExecutionException { |
2.5 execute 处理
具体业务的处理只有一句 rs = business.execute() , 来看一下着其中的所有逻辑 :
从上一篇文章我们知道 , business 是再 Inter 中构建的一个 TransactionalExecutor 匿名对象
1 | java复制代码 C52- TransactionalExecutor |
methodInvocation 详情
总结
这一篇暂时不说 rollback 流程 , 仅仅说了正常的事务处理流程 , 下一篇来说说rollback 已经 Server 端的处理
本文转载自: 掘金