分布式事物SAGA
概述SAGA
SAGA是1987 Hector & Kenneth 发表的论文,主要是解决长事务执行的问题。有的系统比较旧同时也需要长事物,不能改造,那么比较适用这种场景处理,还有金融行业比较适合用这种事务,主要也是流程会比较长。
SAGA的执行方式
SAGA是两层执行的,事物按流程T1,T2,,,TN。那么与之对应的就是C1,C2,,,CN。也就是由N个分布式事务组织,同时也有N个回滚事务与之对应。如下图,3个服务,A,B,C,这3个服务是按顺序执行的,如果B事务执行失败了,那么就会执行B事务的回滚操作。

当事务执行的时间比较长的话,那么需要与之对应的回滚服务。
存在的问题
我们举个转账的例子吧,A账户向B账户进行转账,A、B账户各100元,B账户需要+50元,A账户需要-50元,这个时候假如有两个不同的银行,那么会有两个服务。当B账户增加了50元的时候,A账户还没有-50元,也就意味着,此时已经将B账户增加增加好了,事务已经执行成功了。我们还需要执行回滚操作,将B账户增加的钱减回去。
因为金融行业,可以多出来钱,不能少钱,因为钱少了就找不回来了这种特性,所以在设计的时候需要先将账户加钱。
再一个SAGA只允许两层嵌套,因为流程已经很长了,嵌套多了在深度和性能上都不允许。
重试机制
还是如上例子,当A账户转账完了之后,往B账户转账失败了,那么需要将失败的情况记录下来。并且服务需要设计成幂等的,这个时候有个程序来检查任务,然后再进行重试,重试次数多了也不会对结果造成影响。
重试可以采用指数形式进行,且重试到一定次数的时候将进行预警,然后人工介入。
SAGA VS TCC
- TCC采用的中间的状态进行的数据存储,中间如果有数据查询的话不会影响结果。而SAGA会直接将事务进行提交,没有中间的结果。整个事务执行完了之后可能对结果造成变化。
- TCC需要编写try,confirm,cancel三个服务的逻辑,这样代码会非常多。但是因为逻辑代码可以控制且中间态也不影响结果,处理速度会比较快,高并发执行效率高,深受互联网欢迎。而SAGA对业务的侵入会较低,通过注解的方式可以
- 流程较长的时候需要采用SAGA,业务流程长,业务流程复杂,当针对旧代码不能改造成分布式事务的代码可以选择SAGA。TCC比较适合流程少,对实时结果要求比较高,高并发的场景比较适合。
实现SAGA的框架
支持SAGA的有 seata, Easytransaction。
分布式事物SAGA的更多相关文章
- Atomikos和GTS-Fescar和TCC-Transaction和TX-LCN分布式事物的比较
什么是分布式事物 分布式系统中保证不同节点之间的数据一致性的事物,叫做分布式事物. 为什么要用分布式事物 微服务,SOA等服务架构模式,一个是service产生多个节点,另一个是resource产生多 ...
- 开启分布式事物DTC
1.web服务器开启分布式事物配置后,数据库服务器的host文件要设置 “IP web服务器主机名” 的映射,否则会 出现 “与基础事务管理器的通信失败” #跨网段使用TransactionSco ...
- 2018-01-08 学习随笔 SpirngBoot整合Mybatis进行主从数据库的动态切换,以及一些数据库层面和分布式事物的解决方案
先大概介绍一下主从数据库是什么?其实就是两个或N个数据库,一个或几个主负责写(当然也可以读),另一个或几个从只负责读.从数据库要记录主数据库的具体url以及BigLOG(二进制日志文件)的参数.原理就 ...
- MySQL分布式事物(XA事物)的使用
有时一个系统的数据 放在不同的库之中.如果用普通的事物 一个分支库提交成功了,另外一个分支库提交失败了, 这候 两个库没有同步的成功或者失败.会导致系统数据的不完整. 对于处理这种情况 MySQL有了 ...
- mq解决分布式事物问题【代码】
上节课简单说了一下mq是怎么保证数据一致性的.下面直接上代码了. 所需环境:1.zookeepor注册中心 2.kafka的服务端和工具客户端(工具客户端也可以不要只是为了更方便的查看消息而已) ...
- mq解决分布式事物问题
今天只看看原理,下一节看项目怎么集成mq进行解决分布式事物. 1.什么情况下会使用到分布式事物? 举例说明:现有一个支付系统,因为项目使用的是微服务框架,有订单模块和支付模块两个模块.生产者进行订单的 ...
- 分布式事物解决方案-TCC
分布式框架下,如何保证事物一致性一直是一个热门话题.当然事物一致性解决方案有很多种(请参考:分布式事物一致性设计思路),我们今天主要介绍TCC方案解决的思路.以下是参与设计讨论的一种解决思路,大家有问 ...
- Springboot与ActiveMQ、Solr、Redis中分布式事物的初步探索
Springboot与ActiveMQ.Solr.Redis中分布式事物的初步探索 解决的场景:事物中的异步问题,当要求数据库与solr服务器的最终一致时. 程序条件: 利用消息队列,当数据库添加成功 ...
- 分布式的一致性(分布式事物)-------2PC详述
英文名:Two Phase Commit(2PC) 算法目的:实现分布式事物 算法概述: 有两类节点: -----协调者 -----事务参与者 流程阶段: -----请求阶段 -----提交阶段 算法 ...
随机推荐
- Dockerfile优化——supervisor服务
一.理解supervisor(supervisor服务不仅在容器中可用,在宿主机中也适用) 1.Dockerfile中的CMD可以指定启动容器后执行的第一个命令,但是当有多个服务进程需要启动的时候,就 ...
- github搜索技巧小结
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- inet_aton和inet_ntoa
3.1 inet_aton() int inet_aton(const char *cp, struct in_addr *inp); 参数说明: cp : IPv4点分十进制字符串,例如" ...
- Sentry Web 性能监控 - Trends
系列 1 分钟快速使用 Docker 上手最新版 Sentry-CLI - 创建版本 快速使用 Docker 上手 Sentry-CLI - 30 秒上手 Source Maps Sentry For ...
- tk.mybatis中常用方法的使用(最实用)
一.前言 不知道环境和maven依赖怎么配置的,先看一下这个: SpringBoot整合tk.mybatis 二.方法的介绍和使用 插入方法 int insertSelective(T var1); ...
- Dockerfile 自动制作 Docker 镜像(一)—— 基本命令
Dockerfile 自动制作 Docker 镜像(一)-- 基本命令 前言 a. 本文主要为 Docker的视频教程 笔记. b. 环境为 CentOS 7.0 云服务器 c. 上一篇:手动制作Do ...
- 关于pycharm创建django1.x和3.x项目的说明
1.我创建了两个模板文件分别代表django1.x和3.x 2.两个模板文件分别为Django1Template和Django3Template (不同模板文件中存放不同的django版本) 3.使用 ...
- PHP中的PDO操作学习(三)预处理类及绑定数据
要说 PDO 中最强大的功能,除了为不同的数据库提供了统一的接口之外,更重要的就是它的预处理能力,也就是 PDOStatement 所提供的功能.因为它的存在,才让我们可以安心地去使用而不用操心 SQ ...
- no rxtxSerial in java.library.path
java开发过程中,遇到no rxtxSerial in java.library.path问题,是由于缺少一个dll文件导致. 在jre/bin下添加rxtxSerial.dll 文件 win10环 ...
- LR录制附件上传后,回放报错
使用LR录制附件上传后,点击回放,发现报错:没有找到上传的文件 Could not obtain information about submitted file "C:\Users\Adm ...