分布式协同 - 分布式事务_TCC解决方案
文章目录
- 导图
- Pre
- 流程图
- 2PC VS 3PC VS TCC
- 2PC(Two-Phase Commit,二阶段提交)
- 3PC(Three-Phase Commit,三阶段提交)
- TCC(Try-Confirm-Cancel)
- 2PC、3PC与TCC的区别
- 2PC、3PC与TCC的联系
导图
Pre
随着大流量、高并发业务场景的出现,对系统可用性的要求变得越来越高,这时 CAP 理论和 BASE 理论逐渐进入人们的视野,柔性事务成为分布式事务的主要实现方式,TCC 作为补偿事务也位列其中.
TCC(Try-Confirm-Cancel)的核心思想是对于每个资源的原子操作,应用程序都需要注册一个与此操作对应的确认操作和补偿(撤销)操作。其中确认操作负责在原子操作执行成功时进行事务提交,补偿操作负责在原子操作执行失败时对事务进行回滚。
流程图
-
Try阶段(资源锁定):
- 客户端(A)发起请求,通知服务B进行事务操作。
- 服务B执行Try操作,尝试锁定资源(例如扣款或占用库存)。此时,服务B的资源被锁定,但尚未提交任何操作。
- 服务B返回给客户端A,表示资源已锁定,并准备进入下一阶段。
-
Confirm阶段(提交):
- 客户端(A)根据其他服务的响应,决定是否进入Confirm阶段。
- 服务C接收到确认请求后,执行Confirm操作,将之前的预处理结果提交(如真正扣款、更新库存等)。
- 如果操作成功,服务C返回确认成功给客户端A,表示事务提交完成。
-
Cancel阶段(回滚):
- 如果在Try阶段发现某些条件未达成(例如余额不足,库存不足等),或者在Confirm阶段发生错误,客户端或服务将请求进入Cancel阶段。
- 服务C会执行Cancel操作,回滚之前的操作(如退还款项或恢复库存)。
- 服务C返回取消失败信息,客户端A可以根据返回结果进行相应的补救措施。
2PC VS 3PC VS TCC
2PC(Two-Phase Commit,二阶段提交)
2PC协议是分布式事务中最基础的协议,分为两个阶段:
-
准备阶段(Voting Phase):协调者(通常是事务管理器)向所有参与者发送“准备提交”请求,要求参与者执行事务操作并保留结果,但不提交数据,参与者需要返回“准备好”或“无法提交”的响应。
-
提交阶段(Commit Phase):如果所有参与者都返回“准备好”,则协调者发送“提交”请求,所有参与者正式提交操作。如果任何一个参与者返回“无法提交”,则协调者发送“回滚”请求,所有参与者回滚操作。
优点:
- 实现简单,易于理解。
缺点:
- 阻塞问题:如果协调者崩溃,参与者会一直等待协调者的决策,造成系统阻塞。
- 单点故障:协调者是单点,若协调者失败,事务无法完成。
- 资源占用:参与者需要长时间持有锁,直到事务提交或回滚。
3PC(Three-Phase Commit,三阶段提交)
3PC是在2PC基础上改进而来的,目的是解决2PC中的阻塞问题。它增加了一个额外的阶段来进行更细粒度的事务状态控制。
-
询问阶段(CanCommit Phase):协调者询问所有参与者是否可以执行事务,并预备提交。参与者在此阶段进行必要的预处理。
-
预提交阶段(PreCommit Phase):所有参与者确认可以提交后,协调者要求所有参与者进行预提交操作。此时,参与者已经做好提交操作的准备,但还没有真正提交。
-
提交阶段(DoCommit Phase):协调者正式通知所有参与者提交操作,事务正式完成。
优点:
- 改进了2PC的阻塞问题,因为3PC在协调者崩溃后参与者不会一直等待,可以通过预提交阶段保证一致性。
缺点:
- 实现复杂。
- 仍然存在一定的网络分区和故障恢复问题。
TCC(Try-Confirm-Cancel)
TCC是分布式事务处理中较为复杂的一种方案,通常在资源管理和高一致性要求的场景下使用。它将分布式事务拆解为三个阶段:Try、Confirm和Cancel。
-
Try(尝试):在此阶段,参与者执行尝试操作,如锁定资源,并确保幂等性。Try阶段完成后,系统处于“预提交”状态,但未真正提交数据。
-
Confirm(确认):在所有操作都顺利完成时,协调者通知各参与者提交事务。此时所有操作都是最终的提交。
-
Cancel(取消):如果某些操作失败,或者出现异常,协调者会通知参与者回滚操作,恢复到事务前的状态。
优点:
- 高度可控,支持显式的回滚。
- 支持幂等性操作,能更好地处理异常场景。
缺点:
- 需要在每个参与者上实现Try、Confirm和Cancel逻辑,复杂度较高。
- 性能和资源消耗较大,因为每个参与者都需要进行锁定和操作恢复。
2PC、3PC与TCC的区别
特性 | 2PC | 3PC | TCC |
---|---|---|---|
阶段 | 2个阶段:准备、提交 | 3个阶段:询问、预提交、提交 | 3个阶段:尝试、确认、取消 |
阻塞问题 | 存在,协调者崩溃时参与者会一直阻塞 | 解决了部分阻塞问题,但不完全消除 | 无阻塞问题,失败时有明确的回滚操作 |
容错能力 | 较差,协调者故障会导致整个事务失败 | 相较2PC,容错能力提高,但仍有不足 | 较强,支持回滚,适合高度容错和一致性要求的场景 |
资源占用 | 参与者需要长时间持有锁,资源占用较大 | 参与者需要长时间持有锁,资源占用较大 | 各参与者在不同阶段持有锁,资源占用较大 |
复杂度 | 简单实现,但功能受限 | 实现较复杂,增加了容错机制 | 实现较复杂,需要业务逻辑支持 |
适用场景 | 一致性要求较低的小型分布式系统 | 对容错性有一定要求的分布式事务系统 | 高一致性、高可用性要求的复杂场景,尤其是金融、库存管理等 |
2PC、3PC与TCC的联系
-
相似性:这三种协议都属于分布式事务协议,目的是保证分布式系统中多个参与者的一致性和数据的可靠性。它们都涉及到协调者与参与者之间的交互,以及如何确保事务的一致性和成功提交。
-
演化关系:2PC是最早的分布式事务协议,虽然实现简单,但存在阻塞和单点故障的问题。为了避免这些问题,3PC在2PC的基础上增加了一个预提交阶段,进一步解决了阻塞问题。而TCC则通过引入Try、Confirm和Cancel三个阶段,提供了更灵活的事务控制,适合于更复杂的分布式事务场景。
-
应用场景重叠:这三种协议在一些场景中可以互相替代,例如金融系统的支付操作等高一致性场景。但在不同的系统需求下,选择的协议会有所不同。TCC特别适合对事务回滚有要求且资源操作可幂等的场景。
相关文章:

分布式协同 - 分布式事务_TCC解决方案
文章目录 导图Pre流程图2PC VS 3PC VS TCC2PC(Two-Phase Commit,二阶段提交)3PC(Three-Phase Commit,三阶段提交)TCC(Try-Confirm-Cancel)2PC、3PC与TCC的区别2PC、3PC与TCC的联系 导…...

MFC/C++学习系列之简单记录13
MFC/C学习系列之简单记录13 前言memsetList Control代码注意 总结 前言 今天记录一下memset和List control 的使用吧! memset memset通常在初始化变量或清空内存区域的时候使用,可以对变量设定特定的值。 使用: 头文件: C&#…...
PostgreSQL表达式的类型
PostgreSQL表达式是数据库查询中非常重要的组成部分,它们由一个或多个值、运算符和PostgreSQL函数组合而成,用于计算出一个单一的结果。这些表达式类似于公式,可以用查询语言编写,并用于查询数据库中的特定数据集。 PostgreSQL表…...

速通Python 第四节——函数
一、函数 编程中的函数和数学中的函数有一定的相似之处. 数学上的函数, 比如 y sin x , x 取不同的值, y 就会得到不同的结果. 编程中的函数, 是一段 可以被重复使用的代码片段 代码示例 : 求一段范围的数的和 , 不使用函数 # 1. 求 1 - 100 的和 sum 0 for i in range(1, …...
如何在Windows系统上安装和配置Maven
Maven是一个强大的构建和项目管理工具,广泛应用于Java项目的自动化构建、依赖管理、项目构建生命周期控制等方面。在Windows系统上安装Maven并配置环境变量,是开发者开始使用Maven的第一步。本文将详细介绍如何在Windows系统上安装和配置Maven࿰…...

STM32之GPIO输出与输出
欢迎来到 破晓的历程的 博客 ⛺️不负时光,不负己✈️ 文章目录 一.GPIO输入1.1GPIP简介1.2GPIO基本结构1.3GPIO位结构1.4GPIO的八种模式1.4.1浮空/上拉/下拉输入1.4.2 模拟输入1.4.3 推挽输出\开漏输出 二.GPIO输入2.1.按键介绍2.2传感器模块介绍2.3按键电路 一.G…...
linux定时器操作
目录 1 简单示例2 timer_create方式2.1 SIGEV_SIGNAL信号方式通知2.2 SIGEV_THREAD启动线程方式通知2.3 参数 1 简单示例 #include <stdio.h> #include <stdlib.h> #include <sys/time.h> #include <signal.h> #include <unistd.h>void setup_t…...

重拾设计模式--观察者模式
文章目录 观察者模式(Observer Pattern)概述观察者模式UML图作用:实现对象间的解耦支持一对多的依赖关系易于维护和扩展 观察者模式的结构抽象主题(Subject):具体主题(Concrete Subject…...
Vue.js前端框架教程7:Vue计算属性和moment.js
文章目录 计算属性(Computed Properties)基本用法缓存机制计算属性 vs 方法使用场景计算属性的 setter 和 getter结论Moment.js 进行时间处理1. 安装 Moment.js2. 在 Vue 组件中引入 Moment.js3. 在全局使用 Moment.js4. 使用 Vue 插件的方式引入 Moment.js5. 常用日期格式化…...

【游戏设计原理】22 - 石头剪刀布
一、游戏基础:拳头、掌心、分指 首先,石头剪刀布(又名“Roshambo”)看似简单,实际上可是个“深藏玄机”的零和博弈(听起来很高深,其实就是输赢相抵消的意思)。游戏中有三种手势&…...

3-Gin 渲染 --[Gin 框架入门精讲与实战案例]
在 Gin 框架中,渲染指的是将数据传递给模板,并生成 HTML 或其他格式的响应内容。Gin 支持多种类型的渲染,包括 String HTML、JSON、XML 等。 String 渲染 在 Gin 框架中,String 渲染方法允许你直接返回一个字符串作为 HTTP 响应…...

python小课堂(一)
基础语法 1 常量和表达式2 变量和类型2.1 变量是什么2.2 变量语法 3 变量的类型3.1 动态类型特性 4 注释4.1注释是什么 5 输入输出5.1 print的介绍5.2 input 6 运算符6.1 算术运算符在这里插入图片描述6.2 关系运算符6.3 逻辑运算符6.4赋值运算符 1 常量和表达式 在print()中可…...

GESP202309 二级【小杨的 X 字矩阵】题解(AC)
》》》点我查看「视频」详解》》》 [GESP202309 二级] 小杨的 X 字矩阵 题目描述 小杨想要构造一个 的 X 字矩阵( 为奇数),这个矩阵的两条对角线都是半角加号 ,其余都是半角减号 - 。例如,一个 5 5 5 \times 5 5…...
@PostConstruct注解解释!!!!
PostConstruct 注解修饰的方法是在 Bean 完成初始化后自动调用的。它是 Java EE 和 Spring 中的一种机制,用于在 Bean 被创建并依赖注入完成后,执行一些初始化的操作。 具体触发时机: 依赖注入完成后:首先,Spring 容器…...

laya游戏引擎中打包之后图片模糊
如下图正常运行没问题,打包之后却模糊 纹理类型中的默认类型都是精灵纹理,改为默认值即可。注意:要点击“应用”才可有效。精灵纹理类型会对图片进行渲染处理,而默认值 平面类型不会处理图片。...

【数据结构练习题】链表与LinkedList
顺序表与链表LinkedList 选择题链表面试题1. 删除链表中等于给定值 val 的所有节点。2. 反转一个单链表。3. 给定一个带有头结点 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。4. 输入一个链表,输出该链…...

[项目代码] YOLOv8 遥感航拍飞机和船舶识别 [目标检测]
项目代码下载链接 <项目代码>YOLO 遥感航拍飞机和船舶识别<目标检测>https://download.csdn.net/download/qq_53332949/90163939YOLOv8是一种单阶段(one-stage)检测算法,它将目标检测问题转化为…...

移动魔百盒中的 OpenWrt作为旁路由 安装Tailscale并配置子网路由实现在外面通过家里的局域网ip访问内网设备
移动魔百盒中的 OpenWrt作为旁路由 安装Tailscale并配置子网路由实现在外面通过家里的局域网ip访问内网设备 一、前提条件 确保路由器硬件支持: OpenWrt 路由器需要足够的存储空间和 CPU 性能来运行 Tailscale。确保设备架构支持 Tailscale 二进制文件,例…...

JVM对象分配内存如何保证线程安全?
大家好,我是锋哥。今天分享关于【JVM对象分配内存如何保证线程安全?】面试题。希望对大家有帮助; JVM对象分配内存如何保证线程安全? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在JVM中,对象的内存分配…...

ArcGIS计算土地转移矩阵
在计算土地转移矩阵时,最常使用的方法就是在ArcGIS中将土地利用栅格数据转为矢量,然后采用叠加分析计算,但这种方法计算效率低。还有一种方法是采用ArcGIS中的栅格计算器,将一个年份的地类编号乘以个100或是1000再加上另一个年份的…...

第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...

C++初阶-list的底层
目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...

页面渲染流程与性能优化
页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序
一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...

SpringCloudGateway 自定义局部过滤器
场景: 将所有请求转化为同一路径请求(方便穿网配置)在请求头内标识原来路径,然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...