分布式事物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) 算法目的:实现分布式事物 算法概述: 有两类节点: -----协调者 -----事务参与者 流程阶段: -----请求阶段 -----提交阶段 算法 ...
随机推荐
- JDBC简介及JDBC编写步骤及常见API
JDBC : Java Database Connectivity,Java数据库连接.SUN公司为了简化.统一对数据库的操作,定义了一套Java操作数据库的规范,称之为JDBC. JDBC就像一座桥 ...
- Spring依赖注入的四种方式
首先,我们需要定义一个Bean的class类: package framework.spring; import org.springframework.beans.BeansException; i ...
- Jenkins 使用PowerShell插件部署Net5项目
Jenkins安装 PowerShell plugin 插件 新建自由项目 拖到 构建 处,添加 PowerShell 构建 贴入下方脚本即可 # 变量 $ProjectPath = "E: ...
- MySQL——SQL语句入门
1.DDL: 数据库定义语言 定义对象:库.表 何为定义: 库的定义: 创建 删除 修改---->修改本身以及库中的对象(表.视图.函数.触发器...) 表的定义: 创建---->定义表的 ...
- 使用Mosquitto实现MQTT客服端C语言
上一篇文章已经将mosquitto移植到了arm平台上,现在将使用mosquitto完成mqtt客服端的demo,了解过mqtt协议的小伙伴都知道,mqtt主要分为代理服务器.发布者.订阅者三部分 ...
- Intel® QAT加速卡之Ring & Ring Bank
1. QAT的应用模式 Intel 通讯系列芯片对于每种受支持的加速服务(加密,数据压缩),都支持以下应用模式: 内核模式,其中应用程序和加速服务都在内核中运行空间. 用户空间直接访问在用户空间中运行 ...
- pythonGUI-PySide2的使用笔记
用python开发跨平台的图形化界面,主流的有3种选择: Tkinter 基于Tk的Python库,Python官方标准库,稳定.发布程序较小,缺点是控件相对较少. wxPython 基于wxWidg ...
- scrum项目冲刺_day02总结
摘要:今日完成任务. 1.appUI页面完成 2.图像识别正在进行 总任务: 一.appUI页面(已完成) 二.首页功能: 1.图像识别功能 2.语音识别功能 3.垃圾搜索功能 4.相关新闻爬取 三. ...
- python面向对象(封装,继承,多态)
python面向对象(封装,继承,多态) 学习完本篇,你将会深入掌握 如何封装一个优雅的借口 python是如何实现继承 python的多态 封装 含义: 1.把对象的属性和方法结合成一个独立的单位, ...
- PHP中的国际化日历类
在 PHP 的国际化组件中,还有一个我们并不是很常用的跟日期相关的操作类,它就是日历操作类.说是日历,其实大部分还是对日期时间的操作,一般也是主要用于日期的格式化和比较之类的.但是通常我们直接使用 d ...