SeataAT模式原理
Seata架构
Seata将分布式事务理解为一个全局事务,它由若干个分支事务组成,一个分支事务就是一个满足ACID的本地事务。
Seata架构中有三个角色:
TC (Transaction Coordinator) - 事务协调者
维护全局和分支事务的状态,驱动全局事务提交或回滚。
TM (Transaction Manager) - 事务管理器
定义全局事务的范围:开始全局事务、提交或回滚全局事务。
RM (Resource Manager) - 资源管理器
管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。
刚入门时,可能不太理解这三个角色的关系,举个例子来描述:假设我们有一个下单业务,用户发起下单(Create_Order)后需要进行支付扣款,扣库存。Create_Order需要调用其他两个服务进行数据的更新。
这里OrderService这个微服务就是TM,它发起了全局事务, 库存和支付都是事务的参与者,也就是RM,而全局事务的进行需要TC协调两个RM完成
下图能更直观地感受它们的分工:
(图侵删)
简单说明全局事务的执行过程:
- TM向TC申请开启一个全局事务,TC创建全局事务后,会生成一个全局唯一的XID,存入
global_table中。 XID会在全局事务上下文中传播 - RM请求TC将本地事务注册成全局事务的分支事务,该分支事务和全局事务有相同的XID
- TM向TC发起全局提交或回滚
- TC调度XID下的分支事务完成提交或回滚。
AT模式
AT模式是Seata默认模式。它从两阶段提交演化而来,改善了XA模式中资源占用过长导致性能下降的问题。
和XA的区别:AT模式下的第一阶段RM将在执行完事务后,会保存记录一份快照,然后直接提交并释放资源,若第二阶段通知事务需要回滚,再进行反向补偿,修改为提交前的数据。
在这个过程中,Seata做了不少增强:我们的业务Sql实际上不是直接就在DB中运行,而是被Seata的数据源代理拦截,那么Seata做了什么工作呢,我们接下来继续说:
第一阶段:
- Seata拦截业务sql并解析,根据解析到的信息去查询数据库得到更新前的数据镜像,称为before image。
- 再获取一次执行完后的数据,称为after image
- 将before_image和after_image的数据都插入到 undo_log表中
- 在事务提交前,向TC注册分支,申请获得数据库被写的行的全局锁
- 提交本地事务和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模式原理的更多相关文章
- Spark基本工作流程及YARN cluster模式原理(读书笔记)
Spark基本工作流程及YARN cluster模式原理 转载请注明出处:http://www.cnblogs.com/BYRans/ Spark基本工作流程 相关术语解释 Spark应用程序相关的几 ...
- 深度分析Linux下双网卡绑定七种模式 多网卡的7种bond模式原理
http://blog.csdn.net/abc_ii/article/details/9991845多网卡的7种bond模式原理 Linux网卡绑定mode共有七种(~) bond0.bond1.b ...
- 多网卡的7种bond模式原理
多网卡的7种bond模式原理 Linux 多网卡绑定 网卡绑定mode共有七种(0~6) bond0.bond1.bond2.bond3.bond4.bond5.bond6 常用的有三种 mode=0 ...
- lvs-dr模式原理详解和可能存在的“假负载均衡”
原文地址: http://blog.csdn.net/lengzijian/article/details/8089661 lvs-dr模式原理 转载注明出处:http://blog.csdn.net ...
- 多网卡的7种bond模式原理 For Linux
多网卡的7种bond模式原理 Linux 多网卡绑定 网卡绑定mode共有七种(0~6) bond0.bond1.bond2.bond3.bond4.bond5.bond6 常用的有三种 mode=0 ...
- 【转载】多网卡的7种bond模式原理
多网卡的7种bond模式原理 Linux 多网卡绑定 网卡绑定mode共有七种(0~6) bond0.bond1.bond2.bond3.bond4.bond5.bond6 常用的有三种 mode=0 ...
- go--->共享内存和通信两种并发模式原理探究
共享内存和通信两种并发模式原理探究 并发理解 人类发明计算机编程的本质目的是为了什么呢?毫无疑问是为了解决人类社会中的各种负责业务场景问题.ok,有了这个出发点,那么想象一下,比如你既可以一心一意只做 ...
- LVS负载均衡NAT模式原理介绍以及配置实战
LVS基本原理 流程解释: 当用户向负载均衡调度器(Director Server)发起请求,调度器将请求发往至内核空间 PREROUTING 链首先会接收到用户请求,判断目标 IP 确定是本机 IP ...
- LVS 三种工作模式原理、以及优缺点比较(转载)
原文地址:http://9ilinux.com/149.html 一.NAT模式(VS-NAT) 原理:就是把客户端发来的数据包的IP头的目的地址,在负载均衡器上换成其中一台RS的IP地址,并发至此R ...
随机推荐
- JS+CSS实现数字滚动
最近在实现一个显示RGB颜色数值的动画效果时,尝试使用了writing-mode(书写模式)及 text-orientation来实现文字的竖直方向的排列,并借助CSS的transition(过渡)来 ...
- 详解 CSS 属性 - position
postion 属性定义了一个元素在页面布局中的位置以及对周围元素的影响.该属性共有5个值: position: absolute position: relative position: fixed ...
- 前端每日实战:116# 视频演示如何用 CSS 和原生 JS 开发一个监控网络连接状态的页面
效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/oPjWvw 可交互视频 此视频是可 ...
- WPF控件大全(表格)-学习总结
Label标签 label控件:一般用户描述性文字显示. 在Label控件使用时,一般给予用户提示.用法上没有什么很特殊的,label控件的值记住:不是Text 而是 Content属性. TextB ...
- 【Android开发】简单好用的阴影库 ShadowLayout
先来看一张使用 ShadowLayout 库实现的各种阴影的效果图,如下图所示: 如上图所示,通过使用 ShadowLayout 可以控制阴影的颜色.范围.显示边界(上下左右四个边界).x 轴和 y ...
- HDMS(Headend Device Management System)软件下载
进入官网http://www.pbi-china.com/CHS/index.aspx点击右下角的下载通道.
- 演示默认学习用户scott,默认密码是tiger
默认学习用户scott,默认密码是tiger oracle@prd:/home/oracle$sqlplus /nolog SQL> conn scott/tiger ERROR: ORA-28 ...
- MySQL发展历史
MySQL(发音为"my ess cue el")是一种关系型数据库管理系统, MySQL数据库管理系统由瑞典的DataKonsultAB公司研发,该公司被Sun公司收购,现在Su ...
- event 事件对象
关于event对象 在触发的事件的函数里面我们会接收到一个event对象,通过该对象我们可以得到需要的一些参数,比如说我们需要知道此事件作用到谁身上了,就可以通过event的属性target来获取到( ...
- 使用ABP SignalR重构消息服务(二)
使用ABP SignalR重构消息服务(二) 上篇使用ABP SignalR重构消息服务(一)主要讲的是SignalR的基础知识和前端如何使用SignalR,这段时间也是落实方案设计.这篇我主要讲解S ...