1.主动学习

TCC事务

TCC(Try-Confirm-Cancel)
TCC 方案,它天生适合用于需要强隔离性的分布式事务中,它是一种业务侵入性较强的事务方案,要求业务处理过程必须拆分为“预留业务资源”和“确认 / 释放消费资源”两个子过程

Try:尝试执行阶段,完成所有业务可执行性的检查(保障一致性),并且预留好事务需要用到的所有业务资源(保障隔离性)。

Confirm:确认执行阶段,不进行任何业务检查,直接使用 Try 阶段准备的资源来完成业务处理。注意,Confirm 阶段可能会重复执行,因此需要满足幂等性。

Cancel:取消执行阶段,释放 Try 阶段预留的业务资源。注意,Cancel 阶段也可能会重复执行,因此也需要满足幂等性。

TCC 在业务执行的时候,只操作预留资源,几乎不会涉及到锁和资源的争用,所以它具有很高的性能潜力。
所以,通常我们并不会完全靠裸编码来实现 TCC,而是会基于某些分布式事务中间件(如阿里开源的Seata)来完成,以尽量减轻一些编码工作量。
TCC对业务侵入性强, 当需要对接外部系统时基本无法实现, 不可能到别人的系统里去改造

SAGA 事务

SAGA 事务基于数据补偿代替回滚的柔性事务

SAGA 必须保证所有子事务都能够提交或者补偿,但 SAGA 系统本身也有可能会崩溃,所以它必须设计成与数据库类似的日志机制(被称为 SAGA Log),以保证系统恢复后可以追踪到子事务的执行情况,比如执行都到哪一步或者补偿到哪一步了。

尽管补偿操作通常比冻结 / 撤销更容易实现,但要保证正向、反向恢复过程能严谨地进行,也需要你花费不少的工夫。比如,你可能需要通过服务编排、可靠事件队列等方式来完成。所以,SAGA 事务通常也不会直接靠裸编码来实现,一般也是在事务中间件的基础上完成。我前面提到的 Seata 就同样支持 SAGA 事务模式。

AT事务

它大致的做法是在业务数据提交时,自动拦截所有 SQL,分别保存 SQL 对数据修改前后结果的快照,生成行锁,通过本地事务一起提交到操作的数据源中,这就相当于自动记录了重做和回滚日志。
如果分布式事务成功提交了,那么我们后续只需清理每个数据源中对应的日志数据即可;而如果分布式事务需要回滚,就要根据日志数据自动产生用于补偿的“逆向 SQL”。

而使用的代价就是大幅度地牺牲了隔离性,甚至直接影响到了原子性。因为在缺乏隔离性的前提下,以补偿代替回滚不一定总能成功。

备注

摘自极客时间 - 周志明老师的公开课《周志明的软件架构课》 <- 极其推荐大家阅读~>

2. 写在最后

阿里中间价 SeaTa 既支持TCC也支持SAGA

CAP 定理决定了 C 与 A 不可兼得,传统的 ACID 强一致性在分布式环境中,要想能保证一致性(C),就不得不牺牲可用性(A)。那么这个时候,随着分布式系统中节点数量的增加,整个系统发生服务中断的概率和时间都会随之增长。
所以,我们只能退而求其次,把“最终一致性”作为分布式架构下事务处理的目标。在这两节课中,我给你介绍的可靠事件队列、TCC 和 SAGA,都是实现最终一致性的三种主流模式。

《周志明的软件架构课》学习笔记 Day11相关推荐

  1. 读《周志明的软件架构课》--学习笔记和感想随笔

    主要记录对周老师的<周志明的软件架构课>的学习笔记,本篇章是对课程不可变基础设施部分的学习,从虚拟化的技术理解容器技术的产生和发展,从部署运维角度理解应用的封装,从网络虚拟化理解容器网络, ...

  2. 《周志明的软件架构课》学习笔记 Day6

    1.主动学习 RESTful 服务 REST概念:资源,表征,状态,转移. 服务端与客户端分离(Client-Server) 无状态(Stateless) 可缓存(Cacheability) 分层系统 ...

  3. 《周志明的软件架构课》学习笔记 Day7

    1.主动学习 本地事务如何实现原子性和持久性 事务处理 事务处理几乎是每一个信息系统中都会涉及到的问题,它存在的意义就是保证系统中的数据是正确的,不同数据间不会产生矛盾,也就是保证数据状态的一致性(C ...

  4. 《周志明的软件架构课》学习笔记 Day1

    1.主动学习 每个开发者都需要学习「如何构建一个可靠的分布式系统」 工作这么多年,发现架构设计,还是需要从业务中来迭代,「作为一名架构师,在软件研发的过程中,最难的事儿,其实并不是如何解决具体某个缺陷 ...

  5. 《周志明的软件架构课》学习笔记 Day5

    1.主动学习 远程服务调用(Remote Procedure Call,RPC) RPC 是我们构建分布式系统的最基本前置条件. 这篇文章我们来了解周志明老师笔下的 RPC. RPC 出现的最初目的, ...

  6. 《周志明的软件架构课》学习笔记 Day15

    主动学习 负载均衡 集群部署的特点 信息系统都需要利用多台机器来扩展服务能力,希望用户的请求不管连接到哪台机器上,都能得到相同的处理. 必须对用户一侧保持足够的透明,即使请求背后是由一千台.一万台机器 ...

  7. 《周志明的软件架构课》学习笔记 Day16

    主动学习 服务端缓存 为系统引入缓存的理由 从开发角度来说,引入缓存会提高系统的复杂度,因为你要考虑缓存的失效.更新.一致性等问题(硬件缓存也有这些问题,只是不需要由你来考虑,主流的 ISA 也都没有 ...

  8. 《周志明的软件架构课》学习笔记 Day13

    主动学习 浏览器的客户端缓存 背景:当万维网刚刚出现的时候,浏览器的缓存机制差不多就已经存在了.在 HTTP 协议设计之初,人们便确定了服务端与客户端之间"无状态"(Statele ...

  9. 周志明jvm第三版笔记-第一部分:第一章 走进java

    1.1 概述:java过去.现在.未来简要概述 1.2 java技术体系 Java技术体系包括了以下几个组成部分: Java程序设计语言: 各种硬件平台上的Java虚拟机实现: Class文件格式: ...

最新文章

  1. halcon区域腐蚀膨胀算子_OpenCV 图像处理之膨胀与腐蚀
  2. 齐博地方门户系统v5_社区团购小程序哪个好?-小猪V5社区团购系统,社区团购系统,社区团购小程序,专注社区团购系统研发...
  3. Pycharm连接远程服务器进行代码调试开发
  4. js对象数组转java对象数组对象数组对象数组对象,前台js数组json字符串,后台json转为对象数组的具体实现...
  5. 【转】如何开始学习CoreCLR源代码?
  6. uft自动化测试工具安装步骤_自动化功能测试和接口测试工具整理
  7. [9] ADB 查看设备信息
  8. 定义空列表元素类型_python数据类型是什么
  9. 2019年企业数据生产力调研报告,90%的人都没看过
  10. mysql怎么保证热点数据_MySQL里有2000w数据,redis中只存20w数据,如何保证redis中数据都是热点数据...
  11. sticky-footer布局
  12. 计算机学院硕导北京工业大学,北京工业大学
  13. 《华为研发》阅读 - 11 (中研部组织结构)
  14. 2022 年云计算发展趋势
  15. 计算机网络基本知识(二):网络拓扑结构
  16. 赵小楼《天道》《遥远的救世主》深度解析(54)简单聊聊基督的信仰、教义和天堂的说法
  17. Unity 使用BitmapFont制作自定义字体
  18. 【CSS】固定区域竖向滚动
  19. 用了十年竟然都不对,Java、Rust、Go主流编程语言的哈希表比较
  20. android 6.0 电池曲线,Android6.0 RK3399 电池系统(一)BQ25700 IC 驱动分析 · Younix’s Studio...

热门文章

  1. Linux内核编译出错
  2. IDEA如何连接MySQL数据库?
  3. 在JavaScript中实现商品图片的局部放大(放大镜)
  4. 【详细整理】广度优先算法
  5. [svn] TortoisSVN的Blam功能
  6. MACD抓妖神器 通达信指标公式 副图 源码 无加密 无未来
  7. java springboot mybaits 邮箱注册实现
  8. python+OpenCV笔记(三十七):检测运动物体——使用MOG/KNN背景差分器
  9. linux系统中shell脚本最全详解二shell条件判断语法介绍函数分析
  10. 认认真真推荐几个优质公众号