关于如何实现一个Saga分布式事务框架的思考
关于Saga模式的介绍,已经有一篇文章介绍的很清楚了,链接在这里:分布式事务:Saga模式。
关于TCC模式的介绍,也已经有一篇文章介绍的很清楚了,链接在这里:关于如何实现一个TCC分布式事务框架的一点思考。
1. 子事务动作
Saga的子事务包含两个动作:T和C;TCC的子事务包含三个动作:Try、Commit、Cancel。Saga和TCC相比没有“预留动作”。以经典的A转账给B的例子来说:
Saga:
- T1(A账户余额减少)
- C1(还原A账户余额)
- T2(B账户余额增加)
- C2(还原B账户余额)
TCC
- Try1(A账户余额预扣)
- Commit1(A账户余额减少)
- Cancel1(还原A账户余额)
- Try2(B账户余额预加)
- Commit2(B账户余额增加)
- Cancel2(还原B账户余额)
2. 子事务≠数据库事务
这个需要从两个层面进行展开:
- 首先,无论是Saga还是TCC,一个子事务都包含多个数据库事务。上面的例子中:无论是Saga的T和C,还是TCC的Try、Commit和Cancel,都是一个个完整的数据库事务,天然的具有数据库自身的ACID特性。
- 其次,无论是Saga还是TCC,一个子事务可能并不是数据库操作:比如调用文件服务器进行文件上传、比如发送一封邮件。
3. ACID
这个也需要从两个层面进行展开:
- 首先,从数据库事务层面,在Saga和TCC的中间阶段是不满足一致性(业务逻辑的一致性,而非数据库约束)的
- 其次,从整个分布式事务层面,在Saga和TCC的中间阶段是不满足隔离性的,其他事务可以看到当前事务执行的中间状态
不过以上两个问题都可以通过分布式锁来解决,例如:在执行事务之前对A和B的账户进行加锁,拒绝其他事务的读写操作,但是这样会降低效率。强一致性和高可用性二选一
4. 幂等
关于幂等,要区分子事务是否满足ACID。
- 子事务满足ACID:例如子事务为数据库事务,那么无论是TCC还是Saga,每一个动作都都可以顺利完成或顺利回滚,则不需要幂等性
- 子事务不满足ACID:例如子事务为上传文件, Saga和TCC的T可幂等可不幂等,如果T幂等则可以认为T必定成功则Saga的C和TCC的Cancel不再需要,如果Saga和TCC的T不幂等则Saga的C和TCC的Cancel必须能够处理T部分完成的情况。Saga的C和TCC的Cancel必须幂等,否则当回滚执行失败系统无法确定该再次尝试回滚还是就此放弃。TCC的Commit不存在是否幂等问题,因为按照TCC的规则一旦Try成功则Commit必定成功。
关于如何实现一个Saga分布式事务框架的思考的更多相关文章
- 聊一聊如何用C#轻松完成一个SAGA分布式事务
背景 银行跨行转账业务是一个典型分布式事务场景,假设 A 需要跨行转账给 B,那么就涉及两个银行的数据,无法通过一个数据库的本地事务保证转账的 ACID ,只能够通过分布式事务来解决. 市面上使用比较 ...
- 聊一聊如何用C#轻松完成一个TCC分布式事务
背景 银行跨行转账业务是一个典型分布式事务场景,假设 A 需要跨行转账给 B,那么就涉及两个银行的数据,无法通过一个数据库的本地事务保证转账的 ACID ,只能够通过分布式事务来解决. 在 聊一聊如何 ...
- 分布式事务框架Seata及EasyTransaction架构的比对思考
本文将会对比Seata与EasyTransaction两个分布式事务的一些高层设计,相信大家会有收获. Seata的概述 Seata(曾用名Fescar,开源版本GTS)是阿里的开源分布式事务框架,其 ...
- 快速了解阿里微服务热门开源分布式事务框架——Seata
一.Seata 概述 Seata 是 Simple Extensible Autonomous Transaction Architecture 的简写,由 feascar 改名而来. Seata 是 ...
- tcc分布式事务框架解析
前言碎语 楼主之前推荐过2pc的分布式事务框架LCN.今天来详细聊聊TCC事务协议. 2pc实现:https://github.com/codingapi/tx-lcn tcc实现:https://g ...
- 终于跑通分布式事务框架tcc-transaction的示例项目
1.背景 前段时间在看项目代码的时候,发现有些接口的流程比较长,在各个服务里面都有通过数据库事务保证数据的一致性,但是在上游的controller层并没有对一致性做保证. 网上查了下,还没找到基于Go ...
- TX-LCN 分布式事务框架
第十章 TX-LCN 分布式事务框架 (Spring Cloud 高级) 一. 什么是分布式事务 分布式事务是指事务的参与者.支持事务的服务器.资源服务器以及事务管理器分别位 于不同的分布式系统的不同 ...
- 开源的分布式事务框架 springcloud Alibaba Seata 的搭建使用 一次把坑踩完。。。
seata的使用 1. Seata 概述 Seata 是 Simple Extensible Autonomous Transaction Architecture 的简写,由 feascar 改名而 ...
- 分布式事务框架-Litx补偿事务框架源码解析
前言 之前某段时间在研究分布式事务过程中,对实现原理比较好奇,于是去Gitee上找了几个人气比较高的框架进行学习,其中印象深刻的有Litx,因为Litx源码不多,且都是基于Spring和Dubbo底层 ...
随机推荐
- 《容器化.NET应用架构指南》脑图学习笔记(第一部分)
一.关于这本官方“圣经” 作为.NET程序员,对于微软官方推动的架构示例总是特别关注,从PetShop到MusicStore再到eShopOnContainers,每一次关注,都会了解到业界最新的架构 ...
- jquery 单选框 radio是否选择问题
业务需求是当用户勾选中的时候删除数据,取消勾选的时候数据取消 //单选事件,获取到每行数据ID $('.checkItem').change(function(){ // checkItem是给rad ...
- php中读取大文件实现方法详解
php中读取大文件实现方法详解 来源: 时间:2013-09-05 19:27:01 阅读数:6186 分享到:0 [导读] 本文章来给各位同学介绍php中读取大文件实现方法详解吧,有需要了解 ...
- list.OfType()
将两个类型不同是实体存入到一个object可以通过OfType方法分别取出来 //将两个类型不同是实体存入到一个object可以通过OfType方法分别取出来 List<Phone> Ph ...
- python正则表达式错误集
这篇博文主要记载一些个人的(python)正则表达式的常见错误以及误区,所以,不一定全面,不一定具有权威.但我会把每个例子列出来,争取用事实说话. 大括号中空格问题 In [15]: re.match ...
- 【转帖】IBM发布全新闪存解决方案,助企业存储架构做减法
IBM发布全新闪存解决方案,助企业存储架构做减法 http://stor-age.zhiding.cn/stor-age/2020/0227/3124851.shtml 感觉 配图弄错了 FlashS ...
- TCP-IP ---三次握手和四次挥手来啦
- 如何安装第三方模块#Python
从书上看到用pip install XXX 就可以直接安装模块.下面就是具体操作 1.添加环境变量D:\Python\Scripts\pip.exe 2.打开cmd切换到python安装目录 3.pi ...
- window.onload 方法脚本
//首先 创建一个函数 function windowOload(func){ var onLoad = window.onload; //如果window.onload没有绑定任何函数 则绑定该函数 ...
- 【随缘更(gu)】牛客D4简要思路(没有题解)
T1 当然不能枚举每个区间,于是我们考虑算贡献. 对于每个位置i,我们计算其作为区间内第一个出现ai的位置的区间总数,则有ans=sigma( i - last[i] ) * ( n - i + 1 ...