【分布式理论11】分布式协同之分布式事务(一个应用操作多个资源):从刚性事务到柔性事务的演进
文章目录
- 一. 什么是分布式事务?
- 二. 分布式事务的挑战
- 三. 事务的ACID特性
- 四. CAP理论与BASE理论
- 1. CAP理论
- 1.1. 三大特性
- 1.2. 三者不能兼得
- 2. BASE理论
- 五. 分布式事务解决方案
- 1. 两阶段提交(2PC)
- 2. TCC(Try-Confirm-Cancel)
- 六. 小结
之前我们了解分布式系统中的互斥问题及其解决方案(分布式锁)。互斥问题讨论的是多个进程对同一个临界资源进行操作的问题,而本文将要讨论的是同一个进程对多个临界资源进行操作的问题。
一. 什么是分布式事务?
简单来说,分布式事务就是跨多个独立的资源(比如数据库)进行的事务。
举个例子,假设一个银行系统需要处理一次转账操作:从A账户转出100元分别到B账户30元、C账户70元。这种操作不仅仅涉及到一个数据库,而是涉及多个资源(A账户、B账户、C账户)。这个转账操作要么完全成功,所有的账户变动都要完成;要么完全失败,没有任何账户被修改。类似这样的跨多个资源的事务,我们称之为分布式事务。
二. 分布式事务的挑战
在分布式系统中,跨多个服务和数据库执行的事务面临以下几个挑战:
- 一致性问题:如何保证数据在多个系统中保持一致?
- 网络故障:网络不稳定可能导致事务执行失败,如何保证事务不会中途丢失或被错误提交?
- 并发冲突:多个服务之间并发执行的事务如何互不干扰?
为了处理这些挑战,分布式事务采用了不同的理论和技术框架来确保数据一致性、可用性和事务的正确性。
三. 事务的ACID特性
分布式事务的核心目标是保证事务的一致性和完整性,这与单体应用中的ACID特性密切相关。ACID是事务管理的基本要求,包含以下四个特性:
- 原子性(Atomicity):事务中的所有操作要么全部成功,要么全部失败,不能部分成功。
- 一致性(Consistency):事务执行前后的数据一致,系统从一个一致性状态转变到另一个一致性状态。比如:从 A 账户转出 100元,B 账户中到账 30 元,C 账户中到账 70 元。完成这个事务操作以后,A 账户减少的钱数与 B、C 账户增加的钱数总和应该是一样的,都是 100 元。
- 隔离性(Isolation):并发执行的事务互不干扰,每个事务对外界是隔离的。
- 持久性(Durability):一旦事务提交,数据更改就会永久保存,即使系统崩溃也不丢失。
在单体架构中,ACID特性易于实现,但在分布式系统中,由于网络延迟、节点故障等问题,保证强一致性变得困难。此时,我们需要更灵活的解决方案。
四. CAP理论与BASE理论
1. CAP理论
1.1. 三大特性
在分布式系统中,由于网络和硬件的限制,无法同时保证一致性、可用性和分区容错性,这就是著名的CAP理论的核心思想。CAP理论提出,在一个分布式系统中,最多只能保证以下两个特性:
-
一致性(Consistency):所有节点的视图是相同的,保证每个节点的数据在同一时刻一致。

-
可用性(Availability):可用性是指在分布式系统中,即使一部分节点出现故障,系统仍然可以响应用户的请求。

- 分区容错性(Partition tolerance):假设两个数据库节点(每个节点数据一致)分布在两个区,而这两个区的通信发生了问题,因此无法达成数据一致,这就是分区问题,此时需要从一致性和可用性之间做出选择。是选择一致性(C),等待两个区的数据同步了再去获取数据,还是选择可用性(A),只获取其中一个区的数据?

1.2. 三者不能兼得
CAP理论表明,当网络分区发生时,分布式系统必须在一致性和可用性之间做出选择。如下例子:
业务代码对两个节点的通信失败,往数据库 01 写入记录 A 时,需要锁住数据库02 中的记录 A,不让其他业务代码修改此纪录,直到数据库 01 修改完成。一致性和可用性在此刻是矛盾的,不能兼得。
| 保证特性 | 放弃特性 | 适用场景 | 说明 |
|---|---|---|---|
| 一致性、可用性 | 分区容错性 | 不适用(无法实现) | 如果放弃分区容错性,就等于放弃使用分布式系统,即单体。 |
| 一致性、分区容错性 | 可用性 | 金融领域(如银行、支付系统等) | 需要保证数据一致性,甚至在网络分区时也要牺牲系统可用性,保证交易数据的正确性和一致性。 |
| 可用性、分区容错性 | 一致性 | ToC端应用(如电商网站、社交平台等) | 强调用户体验,牺牲部分一致性以换取系统高可用性,允许数据暂时不一致。适合大流量和高并发的应用场景。 |
2. BASE理论
由于 CAP 理论导致一个应用同时至多只能支持两个特性,无法三全其美,且高并发系统追求的往往是可用性,因此对 CAP 理论进行进一步扩充,产生了 BASE 理论。
| 特性 | 说明 | 举例 |
|---|---|---|
| 基本可用性 | 系统能够在流量激增或节点故障时,通过限流或降级保证用户请求可用。 | 电商系统在流量激增时,优先保证核心业务(如订单处理),将非核心业务降级处理。 |
| 软状态 | 数据副本之间允许存在短时间的数据不一致,容忍数据同步延迟。 | 数据库01中记录A写入后,数据库02中的记录B会在一定延迟后同步,而不是立即同步。 |
| 最终一致性 | 数据在短时间内可能不一致,但过了一段时间后,数据会最终达到一致。 | 在分布式系统中,数据副本可能会在网络延迟时出现不一致,但经过一段时间,数据会同步一致。 |
BASE理论强调的是最终一致性,而不是传统数据库中的强一致性。它适用于那些需要高可用性和容忍短期不一致的系统,例如电商平台和社交网络。
五. 分布式事务解决方案
为了在分布式系统中保证事务的正确性,业界提出了多种分布式事务解决方案,常见的有两阶段提交(2PC) 和 TCC(Try、Confirm、Cancel)。
1. 两阶段提交(2PC)
**两阶段提交协议(2PC)的基本思想是通过协调者(Transaction Manager)和参与者(Resource Manager)来控制事务的提交或回滚。2PC的工作过程分为两个阶段:
准备阶段:
事务协调者(事务管理器)询问每个参与者是否准备好,马上要执行事务了。事务参与者会根据自身业务和资源情况进行检查,然后给出反馈。
检查过程根据业务内容的不同而不同,例如订票业务需要检查是否有剩余票、扣款业务需要检查余额是否足够。只有检查通过,才能返回就绪(ready)信息。否则,事务将终止,并且等待下次询问。由于检查过程需要完成一些操作,因此需要写 redo 日志和 undo 日志,以便事务失败重试,或者失败回滚时使用。

提交阶段:
如下图:如果事务协调者接收到事务参与者检查失败或者超时的消息,会给其发送回滚(rollback)消息,否则发送提交(commit)消息。

以下是整理后的两种情况的处理过程:
| 情况 | 步骤 |
|---|---|
| 情况 1:事务回滚 | 条件:只要有一个事务参与者反馈未就绪(no ready),事务协调者会回滚事务。 |
| 1. 事务协调者向所有事务参与者发出回滚请求。 | |
| 2. 事务参与者使用第一阶段的 undo 日志信息执行回滚操作,并释放事务期间占用的资源。 | |
| 3. 各事务参与者向事务协调者反馈应答(ack)消息,表示完成回滚操作。 | |
| 4. 事务协调者接收到所有事务参与者的应答消息,即完成事务回滚。 | |
| 情况 2:事务提交 | 条件:当所有事务参与者均反馈就绪(ready)消息时,事务协调者会提交事务。 |
| 1. 事务协调者向所有事务参与者发出正式提交事务的请求。 | |
| 2. 事务参与者执行提交(commit)操作,并释放事务期间占用的资源。 | |
| 3. 各事务参与者向事务协调者反馈应答(ack)消息,表示完成提交操作。 | |
| 4. 事务协调者接收到所有事务参与者的应答(ack)消息,即完成事务提交。 |
尽管2PC简单易理解,但它存在问题,比如在网络分区或故障情况下,可能会导致事务挂起,无法继续提交或回滚,造成数据不一致。
2. TCC(Try-Confirm-Cancel)
TCC(Try-Confirm-Cancel)的核心思想是对于每个资源的原子操作,应用程序都需要注册一个与此操作对应的确认操作和补偿(撤销)操作。其中确认操作负责在原子操作执行成功时进行事务提交,补偿操作负责在原子操作执行失败时对事务进行回滚。
TCC协议分为三个阶段:
- Try阶段:进行资源的预检查和预留,确保资源可用。
- Confirm阶段:负责对业务系统做确认提交。如果 Try 阶段执行成功,表明针对资源的操作已经准备就绪,此时执行 Confirm 便会提交对资源的操作。也就是说当资源准备好时,只用提交该操作执行就好了。
- Cancel阶段:负责在业务执行错误,需要回滚时执行业务取消操作,此时就需要释放 Try 阶段预留的资源了。换句话说,是在资源操作执行失败的情况下,根据之前预留的资源情况进行回滚。
TCC协议通过提供灵活的补偿机制,能够在事务失败时进行回滚,保证系统的一致性。
例子:
假设有一个转账服务,需要把 A 银行中 A 账户的 100 元分别转到 B 银行的 B 账户和 C 银行的 C 账户,这三个银行的转账服务各不相同,因此这次转账服务就形成了一次分布式事务。
| 阶段 | 操作描述 | 具体步骤 |
|---|---|---|
| Try 阶段 | 检测资源是否可用,验证所有参与者的资源可用性,并记录相关信息。 | 1. 检查 A 账户余额是否大于 100 元。 2.记录 A 账户的总金额、转出金额。 3. 记录 B、C 账户的总金额、转入金额。 4. 在数据库中保存相关字段(如余额、转出金额)。 5. 如果资源可用,进入 Confirm 阶段;如果不可用,回滚。 |
| Confirm 阶段 | 执行具体的转账逻辑,进行资源更新,并设置事务的成功状态。 | 1. 从 A 账户扣除 100 元,更新余额为 220 - 100 = 120。2. 更新 B 账户余额为 50 + 30 = 80,C 账户余额为 60 + 70 = 130。3. 更新交易状态为转账成功。 4. 向所有参与者发出确认提交请求,确认各方操作。 |
| Cancel 阶段 | 回滚操作,恢复资源到原始状态。 | 1. 如果 Try 阶段失败或资源无法提供,回滚所有操作。 2. A 账户恢复扣除的 100 元,余额为 120 + 100 = 220。 3. B 账户和 C 账户分别恢复相应的金额,B 账户恢复为 80 - 30 = 50,C 账户恢复为 130 - 70 = 60。 4. 事务回滚并释放占用的资源。 |
六. 小结
分布式事务的出现带来了很多挑战,但也推动了事务管理理论和实践的不断发展。从ACID特性到CAP理论、BASE理论,再到DTP、2PC和TCC等分布式事务协议,每一种理论和方案都在不同的应用场景中发挥着重要作用。
在实际开发中,选择哪种分布式事务方案应根据业务需求、系统架构、性能要求等因素来决定。对于高一致性要求的金融类系统,2PC可能更合适;而对于电商类高并发系统,TCC和BASE理论的结合则能提供更高的可用性和灵活性。
相关文章:
【分布式理论11】分布式协同之分布式事务(一个应用操作多个资源):从刚性事务到柔性事务的演进
文章目录 一. 什么是分布式事务?二. 分布式事务的挑战三. 事务的ACID特性四. CAP理论与BASE理论1. CAP理论1.1. 三大特性1.2. 三者不能兼得 2. BASE理论 五. 分布式事务解决方案1. 两阶段提交(2PC)2. TCC(Try-Confirm-Cancel&…...
配置Api自动生成
我的飞书:https://rvg7rs2jk1g.feishu.cn/docx/TVlJdMgYLoDJrsxAwMgcCE14nxt 使用Springfox Swagger生成API,并导入Postman,完成API单元测试 Swagger: 是一套API定义的规范,按照这套规范的要求去定义接口及接口相关信息,再通过可…...
适用于复杂背景的YOLOv8改进:基于DCN的特征提取能力提升研究
文章目录 1. YOLOv8的性能瓶颈与改进需求1.1 YOLOv8的优势与局限性1.2 可变形卷积(DCN)的优势 2. DCN在YOLOv8中的应用2.1 DCN的演变与YOLOv8的结合2.2 将DCN嵌入YOLOv8的结构中2.2.1 DCNv1在YOLOv8中的应用2.2.2 DCNv2与DCNv3的优化 2.3 实验与性能对比…...
Redis_基础
Redis 命令启动、配置密码 Redis是绿色软件,所以直接解压就能使用 配置文件为:redis.windows.conf 启动redis 服务: redis-server.exe redis.windows.conf启动客户端: redis-cli.exe默认没有给Redis配置密码,所以在…...
linux查看程序占用的本地端口
ss是Socket Statistics的缩写,用来替代旧的netstat工具,功能更强大,执行更快。它用于查看系统的网络连接情况,包括TCP、UDP等协议的信息。 一. 命令解析: sudo ss -tulwnpss (Socket Statistics):替代 ne…...
Linux阿里云服务器安装RocketMQ教程
本文为个人云服务器上搭建RocketMQ教程,用于帮助大家降低安装学习成本,提高学习效率。本人在服务器上(我用的是阿里云服务器)安装MQ时遇到了大大小小的问题,因此在最终完成部署后,希望能总结一个教程&#…...
【JavaEE进阶】MyBatis入门
目录 🌴前言 🌲什么是MyBatis? 🌳准备工作 🚩创建工程 🚩配置数据库连接字符串 🚩数据准备 🚩编写持久层代码 🍃单元测试 🌴前言 在应⽤分层学习时,我们了解到…...
Docker 镜像加速器配置指南
Docker 镜像加速器配置指南 2025-02-17 23:00 Linux : Aliyun ECS 服务器 背景问题 在国内,由于网络环境的不稳定,直接从 Docker Hub 拉取镜像的速度可能会很慢,有时甚至会失败。即使配置了官方的阿里云镜像加速器,也可能因为…...
LeetCode-524. 通过删除字母匹配到字典里最长单词
1、题目描述: 给你一个字符串 s 和一个字符串数组 dictionary ,找出并返回 dictionary 中最长的字符串,该字符串可以通过删除 s 中的某些字符得到。 如果答案不止一个,返回长度最长且字母序最小的字符串。如果答案不存在&#x…...
工作-述职笔记
文章目录 述职报告量化指标比较好的想法角色的基本要求项目不好做?减少人员介入的内容知识库 wiki 博客等(公司不一定允许) 点评培训的重要性 很少写关于工作的笔记,但是接触的东西越多,发现有很多知识点以及需要学习的内容。 所以整理下吧。 述职不是小…...
前端VUE+后端uwsgi 环境搭建
1整体架构 请求流程the web clinet--the web server->the socket->uwsgi--django 第一级的nginx并不是必须的,uwsgi完全可以完成整个的和浏览器交互的流程;在nginx上加上安全性或其他的限制,可以达到保护程序的作用;uWSGI本…...
2025软件测试面试题大全(78题含答案解析)
1、什么是兼容性测试?兼容性测试侧重哪些方面? 参考答案: 兼容测试主要是检查软件在不同的硬件平台、软件平台上是否可以正常的运行,即是通常说的软件的可移植性。 兼容的类型,如果细分的话,有平台的兼容…...
微信小程序地图map全方位解析
微信小程序地图map全方位解析 微信小程序的 <map> 组件是一个功能强大的工具,可以实现地图展示、定位、标注、路径规划等多种功能。以下是全方位解析微信小程序地图组件的知识点: 一、地图组件基础 1. 引入 <map> 组件 在页面的 .wxml 文…...
【Bert】自然语言(Language Model)入门之---Bert
every blog every motto: Although the world is full of suffering, it is full also of the overcoming of it 0. 前言 对bert进行梳理 论文: BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding 时间:…...
实时股票行情接口与WebSocket行情接口的应用
实时股票行情接口与WebSocket行情接口的应用 实时股票行情接口是量化交易和投资决策的核心工具之一,行情接口的种类和功能也在不断扩展。介绍几种常见的行情接口,包括实时股票行情接口、Level2行情接口、WebSocket行情接口以及量化行情接口,…...
.NET版PDF处理控件Aspose.PDF教程:在 C# 中将 TIFF 文件转换为 PDF
将TIFF文件转换为PDF文档在各个行业中都是必不可少的。许多企业需要将文档转换为存档、共享或打印。TIFF 文件通常用于图像,而 PDF 是文档共享的标准。将 TIFF 文件转换为 PDF 可确保跨不同平台的兼容性和易用性。在这篇博文中,我们将探讨如何使用 Aspos…...
本地搭建小型 DeepSeek 并进行微调
本文将指导您在本地搭建一个小型的 DeepSeek 模型,并进行微调,以处理您的特定数据。 1. 环境准备 Python 3.7 或更高版本 PyTorch 1.8 或更高版本 CUDA (可选,用于 GPU 加速) Git 2. 克隆 DeepSeek 仓库 bash 复制 git clone https://github.com/deepseek-ai/deepseek.g…...
备战蓝桥杯 Day4 差分
差分(修改区间后查询) 1.要点 a[0]0; for(int i1;i<n;i){diff[i]a[i]-a[i-1];//构建差分数组 } //原数组a区间[l,r]全部加上x diff[l]x;//还原a数组[l,n]全部加上x diff[r1]-x;//还原a数组[r1,n]全部减去x for(int i1;i<n;i){a[i]a[i-1]diff[i]; }实现多次修改完后多次…...
解决华硕主板的Boot界面无法设置M.2的系统启动盘问题
一、问题描述 当我们的华硕主板电脑开机后,发现电脑无法正常进入Windows系统界面,直接显示PXE网络网络信息;且知道我们进入到BIOS界面也无法找到选择系统盘,界面只显示【UEFI:PXE IP4 Intel(R) Ethernet】、【UEFI:PXE IP6 Intel(…...
【Arxiv 大模型最新进展】PEAR: 零额外推理开销,提升RAG性能!(★AI最前线★)
【Arxiv 大模型最新进展】PEAR: 零额外推理开销,提升RAG性能!(★AI最前线★) 🌟 嗨,你好,我是 青松 ! 🌈 自小刺头深草里,而今渐觉出蓬蒿。 NLP Github 项目…...
硬件学习笔记--46 电能表影响量试验梳理
目录 1.电流和电压电路中的谐波影响试验 1)电流和电压电路中谐波——第5次谐波试验 2)电流和电压电路中谐波——方顶波波形试验 3)电流和电压电路中谐波——尖顶波波形试验 4)电流和电压电路中谐…...
Linux-C/C++《C/9、信号:基础》(基本概念、信号分类、信号传递等)
本章将讨论信号,虽然信号的基本概念比较简单,但是其所涉及到的细节内容比较多,所以本章篇幅也会相对比较长。事实上,在很多应用程序当中,都会存在处理异步事件这种需求,而信号提供了一种处理异步事件的方法…...
【工具插件类教学】实现运行时2D物体交互的利器Runtime2DTransformInteractor
目录 编辑 1. 插件核心功能 1.1 基础变换操作 1.2 高级特性 2. 安装与配置 2.1 导入插件 2.2 配置控制器参数 2.3 为物体添加交互功能 3. 使用示例 3.1 基础操作演示 3.2 多选与批量操作 3.3 自定义光标与外观 4. 高级配置技巧 4.1 动态调整包围框控件尺寸 4.…...
OpenCV形态学操作
1.1. 形态学操作介绍 初识: 形态学操作是一种基于图像形状的处理方法,主要用于分析和处理图像中的几何结构。其核心是通过结构元素(卷积核)对图像进行扫描和操作,从而改变图像的形状和特征。例如: 腐蚀&…...
【Ubuntu】GPU显存被占用,但显示没有使用GPU的进程
文章目录 一、问题描述二、解决方案2.1 寻找问题进程2.2 尝试杀死相关进程2.3 投放核弹,一键全杀2.4 再次查看GPU使用情况 参考资料 一、问题描述 今天使用服务器的时候发现gpu被占了很多内存,但是使用 nvidia-smi 命令并没有发现占这么多显存的进程&am…...
什么是pytest.ini及如何在Pytest中应用以提升配置效率
关注开源优测不迷路 大数据测试过程、策略及挑战 测试框架原理,构建成功的基石 在自动化测试工作之前,你应该知道的10条建议 在自动化测试中,重要的不是工具 当通过控制台运行Pytest测试时你必须记住记录输出、运行时环境变量、设置超时时间、…...
通义灵码AI程序员
通义灵码是阿里云与通义实验室联合打造的智能编码辅助工具,基于通义大模型技术,为开发者提供多种编程辅助功能。它支持多种编程语言,包括 Java、Python、Go、TypeScript、JavaScript、C/C、PHP、C#、Ruby 等 200 多种编码语言。 通义灵码 AI…...
以ChatGPT为例解析大模型背后的技术
目录 1、大模型分类 2、为什么自然语言处理可计算? 2.1、One-hot分类编码(传统词表示方法) 2.2、词向量 3、Transformer架构 3.1、何为注意力机制? 3.2、注意力机制在 Transformer 模型中有何意义? 3.3、位置编…...
Git中revert和reset区别?
git revert 和 git reset 都用于撤销 Git 中的提交,但它们的作用和使用场景不同: git revert: 作用:创建一个新的提交,撤销指定的提交内容。使用场景:用于“回滚”已推送到远程仓库的提交。这种方法不会改变提交历史&a…...
使用docker部署NextChat,使用阿里云、硅机流动、deepseek的apikey
1、首先使用安装好了docker的服务器拉取NextChat项目 [rootxx docker]# docker pull yidadaa/chatgpt-next-web 2、启动docker容器,基于不同平台 以下的OPENAI_API_KEY参数替换成自己的就行,启动后访问地址:http://[服务器ip]:3000/ # 硅机…...
