当前位置: 首页 > news >正文

【分布式理论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&…...

【文献阅读】Collective Decision for Open Set Recognition

基本信息 文献名称:Collective Decision for Open Set Recognition 出版期刊:IEEE TRANSACTIONS ON KNOWLEDGE AND DATA ENGINEERING 发表日期:04 March 2020 作者:Chuanxing Geng and Songcan Chen 摘要 在开集识别&#xff0…...

Gorm中的First()、Create()、Update()、Delete()的错误处理

一. First() result : tx.Model(&models.Attachment{}).Where("home ? AND home_id ?", attachment.Home, attachment.HomeID).First(&existingAttachment)如果没有查询到数据,result.Error的值是什么? 在使用 GORM(…...

【心得】一文梳理高频面试题 HTTP 1.0/HTTP 1.1/HTTP 2.0/HTTP 3.0的区别并附加记忆方法

面试时很容易遇到的一个问题—— HTTP 1.0/HTTP 1.1/HTTP 2.0/HTTP 3.0的区别,其实这四个版本的发展实际上是一环扣一环的,是逐步完善的,本文希望帮助读者梳理清楚各个版本之间的区别,并且给出当前各个版本的应用情况,…...

Navicat连接虚拟机数据库详细教程

Navicat连接虚拟机数据库详细教程 以Windows主机 上的navicat 连接ubuntu虚拟机为例 确认虚拟机ip地址和主机ip地址 主机地址查询 cmd输入ipconfig 登录mysql 创建用户 CREATE USER newuserlocalhost IDENTIFIED BY password; CREATE USER newuser% IDENTIFIED BY passwor…...

委托者模式(掌握设计模式的核心之一)

目录 问题: 举例: 总结:核心就是利用Java中的多态来完成注入。 问题: 今天刷面经,刷到装饰者模式,又进阶的发现委托者模式,发现还是不理解,特此记录。 举例: ​老板​…...

DeepSeek-R1 论文笔记:通过强化学习提升大语言模型的推理能力

论文标题:DeepSeek-R1: Incentivizing Reasoning Capability in LLMs via Reinforcement Learning 作者团队:DeepSeek-AI 发表时间:2025 前置知识 & 术语 模型蒸馏 语言模型蒸馏的目标是将大型教师模型的知识(如语义理解、上…...

实现Unity shader扭曲效果

实现思路 1、扭曲材质赋于面片 2、抓取当前一帧的图片内容 3、获取屏幕坐标 4、利用屏幕坐标对抓取的图片采样 5、再采样张扰动贴图做扭曲 Shader "Unlit/NewUnlitShader" {Properties {_DistortTex ("扰动贴图 (RGB)", 2D) "bump" {}_Di…...

七星棋牌 6 端 200 子游戏全开源修复版源码(乐豆 + 防沉迷 + 比赛场 + 控制)

七星棋牌源码 是一款运营级的棋牌产品,覆盖 湖南、湖北、山西、江苏、贵州 等 6 大省区,支持 安卓、iOS 双端,并且 全开源。这个版本是 修复优化后的二开版本,新增了 乐豆系统、比赛场模式、防沉迷机制、AI 智能控制 等功能&#…...

C++STL---<limits>

C <limits> 头文件&#xff1a; <limits> 头文件是 C 标准库中用于获取各种数据类型的数值范围、精度等信息的工具。它通过模板类 std::numeric_limits 提供了对基本数据类型&#xff08;如 int、float、double 等&#xff09;的详细属性查询功能。通过 std::nume…...

一键安装Mysql部署脚本之Linux在线安装Mysql,脚本化自动化执行服务器部署(附执行脚本下载)

相关链接 一键安装Redis部署脚本之Linux在线安装Redis一键安装Mysql部署脚本之Linux在线安装Mysql一键安装JAVA部署脚本之Linux在线安装JDK一键安装Nginx部署脚本之Linux在线安装NginxNavicat最新版(17)详细安装教程Xshell客户端免费版无需注册XFtp客户端免费版无需注册 前言…...

ES、OAS、ERP、电子政务、企业信息化(高软35)

系列文章目录 ES、OAS、ERP、电子政务、企业信息化 文章目录 系列文章目录前言一、专家系统&#xff08;ES&#xff09;二、办公自动化系统&#xff08;OAS&#xff09;三、企业资源规划&#xff08;ERP&#xff09;四、典型信息系统架构模型1.政府信息化和电子政务2.企业信息…...

文生图开源模型发展史(2014-2025年)

文生图开源模型的发展历程是一段充满技术革新、社区生态繁荣与商业化竞争的多维度演进史。 一、技术萌芽期&#xff08;2014-2020年&#xff09; 核心突破 2014年&#xff1a;GAN&#xff08;生成对抗网络&#xff09;诞生&#xff0c;首次实现数据驱动式图像生成&#xff0…...

OA办公系统自动渗透测试过程

目录 一、下载环境源码 二、部署环境 三、测试 XSS漏洞 SQL注入 文件上传漏洞 一、下载环境源码 OA源码打包地址: https://download.csdn.net/download/weixin_43650289/90434502?spm=1001.2014.3001.5503 二、部署环境...

Python标准库【os】5 文件和目录操作2

文章目录 8 文件和目录操作8.7 浏览目录下的内容8.8 查看文件或目录的信息8.9 文件状态修改文件标志位文件权限文件所属用户和组其它 8.10 浏览Windows的驱动器、卷、挂载点8.11 系统配置信息 os模块提供了各种操作系统接口。包括环境变量、进程管理、进程调度、文件操作等方面…...

[代码规范]接口设计规范

一个优雅的接口要如何设计&#xff1f;有哪些设计规范可以遵循&#xff1f; 下面抛砖引玉&#xff0c;分享一些规范。 目录 1、RESTful API 设计最佳实践 2、Shneiderman 的 8 条黄金法则 3、Nielsen 的 10 条启发式规则 1、RESTful API 设计最佳实践 一共18条&#xff0c;参考…...

什么是最终一致性,它对后端系统的意义是什么

最终一致性(Eventual Consistency)是分布式系统中的一种一致性模型。与传统的强一致性模型不同,最终一致性并不要求系统在任何时刻都保持一致,而是保证在足够的时间后,所有节点的数据最终会达到一致的状态。换句话说,系统允许短时间内出现数据的不一致性,但最终会通过某…...

Unity学习笔记之——ugui的性能优化

在Unity中UI优化的核心问题就是重绘和批处理之间的平衡 一、Canvas优化要点 1.优化原因&#xff1a; &#xff08;1&#xff09;Unity为了性能优化&#xff0c;会合并Canvas下的所有元素&#xff1b; &#xff08;2&#xff09;如果把所有面板放到一个Canvas下&#xff0c;会…...

Python接口自动化中操作Excel文件的技术方法

在Python接口自动化测试中&#xff0c;操作Excel文件是一项常见且关键的技术需求。Excel作为数据存储和数据分析的重要工具&#xff0c;在自动化测试中通常用于存储测试用例、测试数据以及测试结果。通过Python操作Excel&#xff0c;可以大大提高测试的效率和灵活性。以下是一些…...

[Windows] 免费电脑控制手机软件 极限投屏_正式版_3.0.1 (QtScrcpy作者开发)

[Windows] 极限投屏_正式版 链接&#xff1a;https://pan.xunlei.com/s/VOKJf8Z1u5z-cHcTsRpSd89tA1?pwdu5ub# 新增功能(Future)&#xff1a; 支持安卓14(Supports Android 14)提高投屏成功率(Improve the success rate of mirror)加快投屏速度(Accelerate screen mirrorin…...

19c补丁后oracle属主变化,导致不能识别磁盘组

补丁后服务器重启&#xff0c;数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后&#xff0c;存在与用户组权限相关的问题。具体表现为&#xff0c;Oracle 实例的运行用户&#xff08;oracle&#xff09;和集…...

SkyWalking 10.2.0 SWCK 配置过程

SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外&#xff0c;K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案&#xff0c;全安装在K8S群集中。 具体可参…...

DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径

目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统&#xff0c;智慧工地全套源码&#xff0c;java版智慧工地源码&#xff0c;支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求&#xff0c;提供“平台网络终端”的整体解决方案&#xff0c;提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

通过Wrangler CLI在worker中创建数据库和表

官方使用文档&#xff1a;Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后&#xff0c;会在本地和远程创建数据库&#xff1a; npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库&#xff1a; 现在&#xff0c;您的Cloudfla…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)

CSI-2 协议详细解析 (一&#xff09; 1. CSI-2层定义&#xff08;CSI-2 Layer Definitions&#xff09; 分层结构 &#xff1a;CSI-2协议分为6层&#xff1a; 物理层&#xff08;PHY Layer&#xff09; &#xff1a; 定义电气特性、时钟机制和传输介质&#xff08;导线&#…...

postgresql|数据库|只读用户的创建和删除(备忘)

CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

稳定币的深度剖析与展望

一、引言 在当今数字化浪潮席卷全球的时代&#xff0c;加密货币作为一种新兴的金融现象&#xff0c;正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而&#xff0c;加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下&#xff0c;稳定…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)

本期内容并不是很难&#xff0c;相信大家会学的很愉快&#xff0c;当然对于有后端基础的朋友来说&#xff0c;本期内容更加容易了解&#xff0c;当然没有基础的也别担心&#xff0c;本期内容会详细解释有关内容 本期用到的软件&#xff1a;yakit&#xff08;因为经过之前好多期…...

MySQL账号权限管理指南:安全创建账户与精细授权技巧

在MySQL数据库管理中&#xff0c;合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号&#xff1f; 最小权限原则&#xf…...