Seata架构

Seata将分布式事务理解为一个全局事务,它由若干个分支事务组成,一个分支事务就是一个满足ACID的本地事务。

Seata架构中有三个角色:

TC (Transaction Coordinator) - 事务协调者

维护全局和分支事务的状态,驱动全局事务提交或回滚。

TM (Transaction Manager) - 事务管理器

定义全局事务的范围:开始全局事务、提交或回滚全局事务。

RM (Resource Manager) - 资源管理器

管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。

刚入门时,可能不太理解这三个角色的关系,举个例子来描述:假设我们有一个下单业务,用户发起下单(Create_Order)后需要进行支付扣款,扣库存。Create_Order需要调用其他两个服务进行数据的更新。

这里OrderService这个微服务就是TM,它发起了全局事务, 库存和支付都是事务的参与者,也就是RM,而全局事务的进行需要TC协调两个RM完成

下图能更直观地感受它们的分工:

(图侵删)

简单说明全局事务的执行过程:

  1. TM向TC申请开启一个全局事务,TC创建全局事务后,会生成一个全局唯一的XID,存入global_table中。 XID会在全局事务上下文中传播
  2. RM请求TC将本地事务注册成全局事务的分支事务,该分支事务和全局事务有相同的XID
  3. TM向TC发起全局提交或回滚
  4. TC调度XID下的分支事务完成提交或回滚。

AT模式

AT模式是Seata默认模式。它从两阶段提交演化而来,改善了XA模式中资源占用过长导致性能下降的问题。

和XA的区别:AT模式下的第一阶段RM将在执行完事务后,会保存记录一份快照,然后直接提交并释放资源,若第二阶段通知事务需要回滚,再进行反向补偿,修改为提交前的数据。

在这个过程中,Seata做了不少增强:我们的业务Sql实际上不是直接就在DB中运行,而是被Seata的数据源代理拦截,那么Seata做了什么工作呢,我们接下来继续说:

第一阶段:

  1. Seata拦截业务sql并解析,根据解析到的信息去查询数据库得到更新前的数据镜像,称为before image。
  2. 再获取一次执行完后的数据,称为after image
  3. 将before_image和after_image的数据都插入到 undo_log表中
  4. 在事务提交前,向TC注册分支,申请获得数据库被写的行的全局锁
  5. 提交本地事务和undo_log表,并将本地事务提交结果报告给TC

第二阶段:

  • 二阶段提交:若事务全部执行成功,RM就可以删除undo_log表并直接提交了。
  • 二阶段回滚收到TC的回滚请求,则根据undo_log表中的befor_image和业务sql的相关信息生成回滚语句在数据库中执行。 进行数据的回滚。

这样一来,事务就不需要一直占用着本地锁了,而是引用了全局锁对数据库的某行进行锁定。接下来我们介绍AT模式下脏写和脏读的问题

AT模式的脏读问题

当我们不引入全局锁,来看两个线程:

很明显,线程2就发生了脏读。如何解决? Seata引入了全局锁的概念:一阶段分支事务提交前,需要申请获得数据库的全局锁(锁定的是被修改的行),在二阶段中如果有其他线程想要修改这一行的数据,除了获取本地锁之外,还需要申请得到全局锁才能修改数据,如下图:

也许有同学会问,如果tx1拥有全局锁,二阶段回滚想要获取本地锁,同时tx2拥有本地锁而想要获取全局锁,那不就死锁了吗?不会,因为Seata给申请锁添加了超时放弃的机制:图中tx2申请全局锁超时后,事务回滚释放了本地锁,tx1获得本地锁成功回滚。

AT模式脏写问题

和脏读类似,如果不引入全局锁,tx1一阶段修改了数据库某行并提交,在第二阶段tx2先进入修改了该行。过后tx1如果要利用快照回滚,tx2就发生了脏写。

Seata引入了全局锁后,一阶段本地事务提交前,需要确保先拿到全局锁,只有拿到全局锁才能提交,在二阶段如果需要回滚,全局锁在事务隔离上就派上了用场:

上图中tx2尝试获取全局锁失败后回滚,tx1重试多次后终于拿到本地锁回滚成功。这个过程中由于全局锁一直由tx1持有,不会出现脏写问题。

参考链接:

Seata AT 模式

SpringCloud实践:Seata分布式事务

SeataAT模式原理的更多相关文章

  1. Spark基本工作流程及YARN cluster模式原理(读书笔记)

    Spark基本工作流程及YARN cluster模式原理 转载请注明出处:http://www.cnblogs.com/BYRans/ Spark基本工作流程 相关术语解释 Spark应用程序相关的几 ...

  2. 深度分析Linux下双网卡绑定七种模式 多网卡的7种bond模式原理

    http://blog.csdn.net/abc_ii/article/details/9991845多网卡的7种bond模式原理 Linux网卡绑定mode共有七种(~) bond0.bond1.b ...

  3. 多网卡的7种bond模式原理

    多网卡的7种bond模式原理 Linux 多网卡绑定 网卡绑定mode共有七种(0~6) bond0.bond1.bond2.bond3.bond4.bond5.bond6 常用的有三种 mode=0 ...

  4. lvs-dr模式原理详解和可能存在的“假负载均衡”

    原文地址: http://blog.csdn.net/lengzijian/article/details/8089661 lvs-dr模式原理 转载注明出处:http://blog.csdn.net ...

  5. 多网卡的7种bond模式原理 For Linux

    多网卡的7种bond模式原理 Linux 多网卡绑定 网卡绑定mode共有七种(0~6) bond0.bond1.bond2.bond3.bond4.bond5.bond6 常用的有三种 mode=0 ...

  6. 【转载】多网卡的7种bond模式原理

    多网卡的7种bond模式原理 Linux 多网卡绑定 网卡绑定mode共有七种(0~6) bond0.bond1.bond2.bond3.bond4.bond5.bond6 常用的有三种 mode=0 ...

  7. go--->共享内存和通信两种并发模式原理探究

    共享内存和通信两种并发模式原理探究 并发理解 人类发明计算机编程的本质目的是为了什么呢?毫无疑问是为了解决人类社会中的各种负责业务场景问题.ok,有了这个出发点,那么想象一下,比如你既可以一心一意只做 ...

  8. LVS负载均衡NAT模式原理介绍以及配置实战

    LVS基本原理 流程解释: 当用户向负载均衡调度器(Director Server)发起请求,调度器将请求发往至内核空间 PREROUTING 链首先会接收到用户请求,判断目标 IP 确定是本机 IP ...

  9. LVS 三种工作模式原理、以及优缺点比较(转载)

    原文地址:http://9ilinux.com/149.html 一.NAT模式(VS-NAT) 原理:就是把客户端发来的数据包的IP头的目的地址,在负载均衡器上换成其中一台RS的IP地址,并发至此R ...

随机推荐

  1. JS+CSS实现数字滚动

    最近在实现一个显示RGB颜色数值的动画效果时,尝试使用了writing-mode(书写模式)及 text-orientation来实现文字的竖直方向的排列,并借助CSS的transition(过渡)来 ...

  2. 微信小程序答题,怎么设计页面渲染,答完一题,跳到下一题

    想要的效果 1.第一页只显示第一道题的内容,如图红框2.答题后,点击下一题,内容显示第二道题的内容 代码 answer.wxml <!--pages/answer/answer.wxml--&g ...

  3. java中Object类的finalize的用法

    Object类的finalize的用法: 马克-to-win:java当中有个垃圾回收机制,具体说,就是当一些对象被创建使用之后若不再使用的话{比如(i)对象被置成null.(ii)局部对象(无需置成 ...

  4. java基础-java异常处理

    异常* A:异常的概述 * 异常就是Java程序在运行过程中出现的错误.* B:异常的分类 * Error:服务器宕机,数据库崩溃等 * ExceptionC:异常的继承体系  * Throwable ...

  5. 将base64转成File文件对象

    function dataURLtoFile(dataurl, filename) { //将base64转换为文件        var arr = dataurl.split(','),      ...

  6. thymeleaf的具体语法

    thymeleaf模板引擎是什么?请点击我查看 文章目录 thymeleaf模板引擎是什么?请点击我查看 代码 该实例代码延续[thymeleaf模板引擎](https://blog.csdn.net ...

  7. 各系统升级openssh

    修订号: [V1.0] 修订人: [陈土锋] 修订日期: [2019.06.04] 前言 该文档只适用用于服务器Redhat,centos,Ubuntu和suse系统的openssh升级.需要注意必须 ...

  8. 代码源 BFS练习1

    BFS练习1 http://oj.daimayuan.top/course/11/problem/147 题目 思路 四个方向进行BFS 注意:此题读写量大,cin会被卡 代码 #include &l ...

  9. brup去除mozilla等无用数据包的方法

    方法一 针对火狐浏览器的解决方法 1.在firefox(火狐浏览器)地址栏中输入: about:config 2.然后出现搜索框,搜索以下内容,双击将它设置成false. network.captiv ...

  10. jsp第七周作业

    1.p78-p79的例4-9 <%@ page language="java" import="java.util.*" pageEncoding=&qu ...