上文我们分析了fescar的一阶段执行过程。在一阶段中,服务起始方发起全局事务并注册到TC。在调用协同服务时,协同服务的事务分支事务会先完成阶段一的事务提交或回滚,并生成事务回滚的undo_log日志,同时上报其事务状态。出现任何异常都会通知TC,TC会通知各个一阶段已提交的事物通过undo_log发起回滚。如果没有异常即可提交事务。

现在我们了解下事务的提交和回滚。

事务提交

fescar通过netty进行服务之间的通信。上文我们说过,无论是提交还是回滚,本质都是发起一次请求到TC。TC在接收到请求后悔分发到com.alibaba.fescar.rm.AbstractRMHandler完成相应的逻辑。下图是相应的请求链

在com.alibaba.fescar.rm.datasource.DataSourceManager#branchCommit中fescar完成了相应的全局事务提交,这里DataSourceManager委托给asyncWorker去实现相应逻辑,asyncWorker是一个异步线程池

我们看下asyncWorker的分支提交代码

1.asyncWorker首先会把分支提交包装成一个二阶段的上下文,并添加到任务数组中

2.定时的去遍历任务数组,删除各个分支事务的undolog。注意这里并没有拿到代理DataSourceProxy。

引用一张官方的流程图

事务回滚

回到DatasourceManage,我们看com.alibaba.fescar.rm.datasource.DataSourceManager#branchRollback这个方法

实际的逻辑是在com.alibaba.fescar.rm.datasource.undo.UndoLogManager#undo中,很明显undo要做的事情就是去执行一阶段生成的undolog进行回滚

最后引用一张官方流程图


fescar的流程分析就告一段落了。其实还有很多的细节需要去完善,例如fescar对异常的处理,undo_log的拼接和执行等。fescar现在改名seata,下个版本将会执行HA,还是很期待它的第一个生产版本。通过本次源码的分析。对于feacar将整个jdbc中的Datasouce,Connnection,Statement三大组件进行了重写的思路感到大开眼界,自己也写了小demo,这次确实学到了好多东西!感谢fescar的开源

最新文章

  1. WPF Step By Step 完整布局介绍
  2. 【Qt】Qt之自定义界面(QMessageBox)【转】
  3. JodaTime用法简介
  4. 如何利用PowerPoint2013制作阶梯流程图?
  5. Python实现BBS自动登录并发帖
  6. google谷歌翻译插件-网页一键翻译
  7. 对JavaScript中this的理解
  8. SQL基本函数
  9. GDAL读取的坐标起点在像素左上角还是像素中心?
  10. 转 docker创建私有仓库和k8s中使用私有镜像
  11. gbdt xgboost 贼难理解!
  12. MongoDb查询
  13. 链接PDO
  14. 内部排序比较(Java版)
  15. iscroll5实现下拉加载更多
  16. TP3.2实例化复杂模型类
  17. numpy数组广播
  18. uva-11044-水题
  19. favico.js笔记
  20. 算法笔记_026:折半查找(Java)

热门文章

  1. bzoj 2428 均分数据 模拟退火
  2. 利用PowerUpSQL攻击SQL Server实例
  3. 危险 AI 花名册
  4. 使用BeetleX的TcpBenchmark工具进行百万设备模拟测试
  5. tday02 上节课复习
  6. mvc、mvp和mvvm
  7. Netty基础系列(2) --彻底理解阻塞非阻塞与同步异步的区别
  8. 整合X-Admin前端框架改造ABP
  9. 前端笔记之ES678&Webpack&Babel(中)对象|字符串|数组的扩展&函数新特性&类
  10. 你真的了解字典(Dictionary)吗?