一、前言

前面两节,我们已经将raincat的demo工程启动,并简单分析了下事务协调者与事务参与者的启动过程。

这一节,我们来看下raincat的事务提交过程。

二、事务提交过程概览

1.二阶段对应图

raincat是一个二阶段分布式事务处理框架,在事务的提交过程中,对应的二阶段如下:

  • 第一阶段(准备阶段)

记录事务信息,准备提交。

  • 第二阶段(提交阶段)

协调者发送提交通知,各参与者分别提交事务。

2.事务提交过程概览

整个事务的提交过程,如下:

(1)切面开始,拦截 @TxTransaction 注解

(2)协调者为发起者创建事务组信息(入Redis)

(3)发起者开启本地事务,并执行业务方法,等待业务方法返回结果

(4)参与者另起线程B,并阻塞主线程A。

线程B中,开启本地事务,让协调者将参与者的事务加入到(2)中的事务组中,然后执行本地业务方法。

以下异步执行

(5)唤醒线程A,参与者业务方法执行完毕。(3)中得到返回结果。

同时,在线程B中去保存补偿日志。并阻塞线程B。

(6)发起者的业务方法执行完毕,去保存补偿日志(入库),并发起预提交请求。

(7)协调者收到请求后,通知发起者提交事务。协调者更新事务组状态为提交,并判断是否能提交。然后通知参与者提交事务,接着通知其他TM提交事务。

(8)发起者提交本地事务,通知协调者完成事务,并删除补偿日志。

(9)参与者提交本地事务,通知协调者完成事务。并删除补偿日志。

(10)定时补偿线程,删除掉每个服务已经提交的补偿日志。

三、事务提交过程时序图

下图主要是以事务发起者的角度分析整个事务提交流程

分布式事务_03_2PC框架raincat源码解析-事务提交过程的更多相关文章

  1. 分布式事务_02_2PC框架raincat源码解析-启动过程

    一.前言 上一节已经将raincat demo工程运行起来了,这一节来分析下raincat启动过程的源码 主要包括: 事务协调者启动过程 事务参与者启动过程 二.协调者启动过程 主要就是在启动类中通过 ...

  2. 分布式_事务_02_2PC框架raincat源码解析

    一.前言 上一节已经将raincat demo工程运行起来了,这一节来分析下raincat的源码 二.协调者启动过程 主要就是在启动类中通过如下代码来启动 netty nettyService.sta ...

  3. 【安卓网络请求开源框架Volley源码解析系列】定制自己的Request请求及Volley框架源码剖析

    通过前面的学习我们已经掌握了Volley的基本用法,没看过的建议大家先去阅读我的博文[安卓网络请求开源框架Volley源码解析系列]初识Volley及其基本用法.如StringRequest用来请求一 ...

  4. spring源码解析--事务篇(前篇)

    对于每一个JAVA程序员,spring应该是再熟悉不过的框架了,它的功能有多强大我就不多说了,既然他有这么强大的功能,是如何实现的呢?这个就需要从他的原理去了解,而最直接了解原理的方式莫过于源码.当然 ...

  5. mybatis源码解析7---MappedStatement初始化过程

    上一篇我们了解到了MappedStatement类就是mapper.xml中的一个sql语句,而Configuration初始化的时候会加载所有的mapper接口类,而本篇再分析下是如何将mapper ...

  6. Spark 源码阅读——任务提交过程

    当我们在使用spark编写mr作业是,最后都要涉及到调用reduce,foreach或者是count这类action来触发作业的提交,所以,当我们查看这些方法的源码时,发现底层都调用了SparkCon ...

  7. 美团分布式ID生成框架Leaf源码分析及优化改进

    本文主要是对美团的分布式ID框架Leaf的原理进行介绍,针对Leaf原项目中的一些issue,对Leaf项目进行功能增强,问题修复及优化改进,改进后的项目地址在这里: Leaf项目改进计划 https ...

  8. 【安卓网络请求开源框架Volley源码解析系列】初识Volley及其基本用法

    在安卓中当涉及到网络请求时,我们通常使用的是HttpUrlConnection与HttpClient这两个类,网络请求一般是比较耗时,因此我们通常会在一个线程中来使用,但是在线程中使用这两个类时就要考 ...

  9. SuperSocket源码解析之启动过程

    一 简介 这里主要说明从配置系统引导启动SuperScoekt作为应用程序,且以控制台程序方式启动 二 启动过程 2.1 配置解析 从读取配置文件开始,直接拿到一个SocketServiceConfi ...

随机推荐

  1. (4.11)DBCC 常用命令

    三.DBCC状态.验证.其他语句 跟踪标识全集:https://www.cnblogs.com/lyhabc/articles/4092507.html 状态语句DBCC INPUTBUFFER 显示 ...

  2. [转载]mvc:view-controller

    1.重定向 ? 1 <mvc:view-controller path="/" view-name="redirect:/admin/index"/> ...

  3. 动态生成ABAP程序-资料

    参考程序: Tcode ABAPdocu--> BC - ABAP Programming--> The ABAP Programming Language--> Special T ...

  4. 算法题 18 像素翻转 牛客网 CC150

    算法题 18 像素翻转 牛客网 CC150_P114 题目描述 有一副由NxN矩阵表示的图像,这里每个像素用一个int表示,请编写一个算法,在不占用额外内存空间的情况下(即不使用缓存矩阵),将图像顺时 ...

  5. 插入排序 Insertion Sort

    插入排序算法的运作如下: 通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入. 插入排序算法的实现我放在这里. 时间/空间复杂度: 最差时间复杂度 O(n^2) 最优时间 ...

  6. Shell Step by Step

    @1:Command: ctrl+z  ------->切后台 fg ------->切前台 Ctrl + a :移到命令行首 Ctrl + e :移到命令行尾 Ctrl + u :从光标 ...

  7. Python之常用模块(re,时间,random,os,sys,序列化模块)(Day20)

    一.时间模块 #常用方法 1.time.sleep(secs) (线程)推迟指定的时间运行.单位为秒. 2.time.time() 获取当前时间戳 在Python中表示时间的三种方式:时间戳,元组(s ...

  8. ZOJ 3960 What Kind of Friends Are You? 【状态标记】

    题目链接 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3960 题意 首先给出 一系列名字 需要辨别的名字,然后给出Q个问 ...

  9. pppoe白皮书

    转:https://blog.csdn.net/achejq/article/details/19478811 PPPoE技术白皮书 关键词:PPP,Ethernet,PPPoE 摘    要:PPP ...

  10. Docker容器技术-Docker架构

    一.Docker系统架构 1.Docker基础架构 1)Docker守护进程 负责容器的创建.运行和监控,以及镜像的构建和存储. docker daemon 2)Docker客户端 通过HTTP与Do ...