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 ...
随机推荐
- 使用Dropbox搭建静态网站详细教程
DropBox是一款非常好用的免费网络文件同步工具,是Dropbox公司运行的在线存储服务,通过云计算实现因特网上的文件同步,用户可以存储并共享文件和文件夹.今天小z和大家分享一下如何使用dropbo ...
- 如何使用vue-cli搭建好的项目
本人是一枚前端小白,也是从零开始学习vue.js.由于闲着蛋疼,写一点自己的经验,可能有点low.是新手想上道的话,可以看看,如果有大神,也可以给我指导一下,小生感激不尽. 关于如何使用vue-cli ...
- Taro时间选择器+地址选择器
时间地址选择器 https://www.manzj.net/topic/5c3c2123cd01b8af5bce4373
- Redis 缓存击穿(失效)、缓存穿透、缓存雪崩怎么解决?
原始数据存储在 DB 中(如 MySQL.Hbase 等),但 DB 的读写性能低.延迟高. 比如 MySQL 在 4 核 8G 上的 TPS = 5000,QPS = 10000 左右,读写平均耗时 ...
- Go xmas2020 学习笔记 10、Slices in Detail
10-Slices in Detail. Slice. Empty vs nil slice
- Java学习day27
今天跟着做了一个模拟龟兔赛跑的程序 只有一条赛道,乌龟和兔子在同一条赛道上比赛,使用了多线程 为了实现兔子睡觉,在run方法内增加了当前奔跑者是否是兔子的判断且当前奔跑步数是否是10的整数倍的判断,如 ...
- grpc流模式-go实现
目录 1. 什么是数据流 2. grpc的四种数据流 2.1 简单模式 2.2 服务端数据流模式 2.3 客户端数据流模式 2.4 双向数据流 3. 上代码 3.1 代码目录 3.2 编写stream ...
- docker进阶_docker-compose
Docker-compose 为什么使用docker-compose 官方介绍 Compose 是一个用于定义和运行多容器 Docker 应用程序的工具.使用 Compose,您可以使用 YAML ...
- RecyclerView + SQLite 简易备忘录-----上
先看效果 图一只是做了简单的页面,没有连接数据库,刚写完页面才想起备忘录好像不需要登录------但用SharedPreferences写了个记住密码. 图二是主页面,实现了搜索,添加,删除,修改几个 ...
- v74.01 鸿蒙内核源码分析(编码方式篇) | 机器指令是如何编码的 | 百篇博客分析OpenHarmony源码
本篇关键词:指令格式.条件域.类型域.操作域.数据指令.访存指令.跳转指令.SVC(软件中断) 内核汇编相关篇为: v74.01 鸿蒙内核源码分析(编码方式) | 机器指令是如何编码的 v75.03 ...