分布式事务讲解 - 2PC、3PC、TCC

news2024/10/9 6:30:08

分布式事务讲解 - 2PC、3PC、TCC

前置知识

BASE理论:

  • BASE是Basically Availbale(基本可用)、Soft state(软状态)、Eventually consistent(最终一致性)三个词语的缩写。
  • BASE理论是对CAP理论中AP的一个扩展,通过牺牲强一致性来获得可用性,当系统出现故障时,允许部分功能不可用,但是要保证核心功能可用,允许数据在一段时间内不一致,但是数据最终要达到一致状态。\
  • 基本可用:分布式系统再出现故障时,允许损失部分功能的可用性,保证核心功能必须可用。
  • 软状态:由于不要求数据的强一致性,所以BASE理论允许系统中出现中间状态(软状态),如:“支付中”、“数据同步中”等状态,待数据达到最终一致后状态修改为最终状态。
  • 最终一致性:指经过一段时间后,所有节点的数据将会达到一致状态,即软状态都变成了最终状态,但是这个需要一定时间的延迟和等待。

What(什么是分布式事务)

  • 一个操作由多个不同服务器的子操作组成,分布式事务就是要保证这些子操作要不全部执行成功,要不全部执行失败。从本质上讲,分布式事务就是为了保证不同数据库的数据一致性。

Why(为什么使用分布式事务)

  • 使用分布式事务的原因总结起来就一个:

  • 一个逻辑对于不同数据库的操作会造成数据不一致的情况,可能一个数据库数据修改成功,但是另一个数据库修改失败,但是这个又不能在本地事务进行处理,为了解决这个问题,分布式事务应运而生。

  • 有人可能会问,微服务情况下调用(使用OpenFeign、RestTemplate等)其他服务方法时,如果一个本地事务执行失败就返回异常,其他服务已执行的操作回滚不就可以了吗?

  • 在这里插入图片描述

  • 如果按照从上往下顺序分别调用【订单服务】、【库存服务】、【积分服务】,这三个服务都要操作数据库,如果前两个服务操作成功,但是调用第三个服务时操作失败,那该怎么办,前两个服务的操作能回滚吗?不能,除非你保存了前两个服务执行的更新sql的所有undo操作,所以,在这种情况下,只能用分布式事务来解决这种数据不一致问题。

How(怎么使用分布式事务)

  • 到现在,分布式事务已经有很多的解决方案了,有2PC、3PC、TCC,这一篇博客,我们先来分别讲讲最早的2PC、3PC这两种解决方案的模型及理论基础,以后再丰富其他的分布式事务解决方案。

2PC(Two Phase Commit)

工作流程
  • 2PC工作流程分两个阶段。
第一阶段
  • 在这里插入图片描述
  • 第一阶段:执行事务操作
  • 事务询问。
    • 协调者节点向所有参与者节点询问是否可以执行提交操作,并开始等待各参与者节点的响应。
  • 执行事务。
    • 参与者节点执行询问发起的所有事务操作,并将Undo信息和Redo信息写入数据库日志。(若操作成功,这里其实每个参与者已经执行了事务操作)
  • 各参与者向协调者反馈事务询问的响应。
    • 各参与者节点响应协调者节点发起的询问。如果参与者节点的事务操作实际执行成功,则反馈一个“同意”消息;如果执行失败,则反馈一个“中止”消息。
第二阶段
  • 在这里插入图片描述
  • 第二阶段:执行事务提交
  • 当所有参与者节点在第一阶段向协调者节点反馈的消息全都是“同意”时:
    • 发送事务提交请求
    • 协调者节点向所有参与者节点发出“正式提交(commit)”请求。
    • 事务正式提交
    • 参与者节点正式完成提交操作,并释放在整个事务期间占用的资源。
    • 反馈事务提交结果
    • 参与者节点向协调者节点发送“完成”消息。
    • 完成事务
    • 协调者节点收到所有参与者节点反馈的“完成”消息后,完成分布式事务。
  • 当任一参与者节点在第一阶段反馈的响应为“中止”,或者协调者在第一阶段接收反馈信息超时:
    • 发送事务回滚请求
    • 协调者节点向所有参与者节点发出“回滚操作(rollback)”请求。
    • 事务回滚
    • 各参与者节点收到请求,利用之前写入的Undo信息执行本地事务回滚操作,并释放在整个事务期间占用的资源。
    • 反馈事务回滚结果
    • 参与者节点向协调者节点发送“回滚完成”消息。
    • 中断事务
    • 协调者节点收到所有参与者节点反馈的“回滚完成”消息后,取消事务。

3PC(Three Phase Commit)

  • 3PC没有解决2PC所有问题,只是降低了灾难的发生概率。
  • 在这里插入图片描述

TCC(Try Commit Cancel)

  • 这个模型有两个个阶段,但是与2PC的三个阶段又有所不同。
第一阶段
  • 在这里插入图片描述
  • 第一阶段:执行Try操作

    • 事务发起。
    • 协调者节点向所有参与者节点发起执行业务逻辑包含数据操作的命令,并开始等待各参与者节点的响应。
    • 执行数据操作。
    • 直接对数据库的数据执行操作。
    • 各参与者向协调者反馈执行操作的响应。
    • 各参与者节点响应协调者节点发起的数据操作。如果参与者节点的数据操作实际执行成功,则反馈一个“同意”消息;如果有一个参与者执行失败,则反馈一个“中止”消息。
第二阶段
  • 在这里插入图片描述
  • 第二阶段:执行Confirm/Cancel操作
  • 根据阶段一各事务参与者的响应,如果所有事务参与者在阶段一执行成功,那就执行Confirm操作,有一个事务参与者在阶段一执行失败,就执行Cancel操作,进行数据库数据恢复。
    • Confirm 操作用于执行数据操作成功之后的业务逻辑。
    • Cancel 操作用于恢复阶段一对数据的操作。
网络语录解析
  • Confirm操作使用预留的资源执行业务操作】
    • 就是在数据更新完这件事的基础上进行后续逻辑的执行。
  • Cancel操作取消执行业务操作,释放预留的资源】
    • 就是恢复数据,可以看做是一个搂底的操作。

总结

2PC、3PC、TCC区别
  • 在2PC的第一阶段基础之上,3PC新加了一个准备阶段(上图所示),用于询问所有参与者节点是否已经准备好要进行分布式事务操作了,这一阶段没有对资源的占用,只是测试数据库是否能获取锁即可,只是保证所有参与者都有能力参与事务,如果有网络或者其他问题就不用进行第二、三阶段了。
  • 在3PC的所有阶段,都为所有参与者节点和协调者节点添加了超时机制,防止因某一节点宕机造成的资源无法释放问题。
  • 2PC中所有阶段,只对协调者节点添加了超时机制。
  • TCC模型主要是在应用层做的一个分布式事务,2PC和3PC则是在数据库层做的分布式事务。
  • TCC模型可以用于不支持事务的数据库,但是2PC和3PC要求数据库必须支持事务。
2PC存在问题
  • 2PC只对协调者节点添加了超时机制,如果协调者这一重要角色宕机,所有参与者的资源就会一直得不到释放,降低系统的可用性。
  • 2PC中,当其中任一节点宕机情况出现时,不能保证数据的最终一致性。
TCC存在问题
  • 代码编写难度高
    每个参与者的业务都要写try、confirm、cancel三个操作,并且各个操作的业务都有所不同
  • 为满足一致性,要满足try、canfirm、cancel三个操作的幂等。
TCC的优点
  • TCC的优点全是因为实现了应用层的分布式事务,优点如下:
    • 可以降低数据库锁冲突,提高吞吐量。
    • 可以通过应用控制数据库锁的粒度,而不用像2PC和3PC使数据库阻塞等待。
    • 可以通过部署集群解决单点故障。
对比2PC,3PC有什么优点
  • 为所有参与者节点和协调者节点添加了超时机制:
    • 1)如果协调者等待参与者反馈信息超时,直接给所有参与者发送中断分布式事务请求。
    • 2)如果在第三阶段任一参与者等待协调者提交事务信息超时,那就默认提交事务
      添加超时机制,可以防止因某一节点宕机造成的资源无法释放问题以及资源占用时间过长问题。
  • 在第一阶段,不锁定资源,就好像在Synchronized外面加了个if条件,能降低分布式事务执行失败率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2198326.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2024最新分别用sklearn和NumPy设计k-近邻法对鸢尾花数据集进行分类(包含详细注解与可视化结果)

本文章代码实现以下功能: 利用sklearn设计实现k-近邻法。 利用NumPy设计实现k-近邻法。 将设计的k-近邻法对鸢尾花数据集进行分类,通过准确率来验证所设计算法的正确性,并将分类结果可视化。 评估k取不同值时算法的精度,并通过…

基于SpringBoot的轻量级CRM管理系统+搭建教程

运行环境:jdk8 IntelliJ IDEA maven 宝塔面板 技术框架:SpringBoot lombok MyBatis 分页助手 freemarker SpringMVC SpringMail 系统功能: 这是一套轻量级的crm管理系统源码,基于SSM的SpringBoot架构。 这套源码用到很多潮流技术…

清华大模型公开课第二季 | Lecture 2 神经网络与大模型基础 Part 1

本文由readlecture.cn转录总结。ReadLecture专注于音、视频转录与总结,2小时视频,5分钟阅读,加速内容学习与传播。 大纲 引言 课程介绍 主讲人介绍 课程内容概述 神经网络基础知识 神经网络的定义和结构 神经元的基本单元 多维输入和权重…

从《被程序员耽搁的外卖员》看IT就业前景

《被程序员耽搁的外卖员》这部作品乍一看,似乎只是一个轻松幽默的故事,讲述一位外卖员因为学习编程而改变生活轨迹的小故事。然而,它在反映社会现实、揭示IT行业就业前景方面具有诸多启示。本文旨在通过此故事来分析当前IT就业的现状和未来发…

Spring Boot读取resources目录下文件(打成jar可用),并放入Guava缓存

1、文件所在位置&#xff1a; 2、需要Guava依赖&#xff1a; <dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>23.0</version></dependency>3、启动时就读取放入缓存的代码&#xf…

​Leetcode 746. 使用最小花费爬楼梯​ 入门dp C++实现

问题&#xff1a;Leetcode 746. 使用最小花费爬楼梯 给你一个整数数组 cost &#xff0c;其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用&#xff0c;即可选择向上爬一个或者两个台阶。 你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。 请你…

Linux源码阅读笔记-以太网驱动分析

驱动框架 Linux 内核网络设备驱动框架分别为四个模块&#xff0c;分别为网络协议借口模块、网络设备接口模块、设备驱动功能模块和网络设备与媒介模块。具体视图如下&#xff1a; 网络协议接口模块&#xff1a;主要功能 网络接口卡接收和发送数据在 Linux 内核当中处理流程如下…

LoRA技术详解---附实战代码

LoRA技术详解—附实战代码 引言 随着大语言模型规模的不断扩大&#xff0c;如何高效地对这些模型进行微调成为了一个重要的技术挑战。Low-Rank Adaptation&#xff08;LoRA&#xff09;技术应运而生&#xff0c;它通过巧妙的低秩分解方法&#xff0c;显著减少了模型微调时需要…

UNIAPP popper气泡弹层【unibest框架下】vue3+typescript

看了下市场的代码&#xff0c;要么写的不怎么好&#xff0c;要么过于复杂。于是把市场的代码下下来了自己改。200行代码撸了个弹出层组件。兼容H5和APP。 功能&#xff1a; 1)只支持上下左右4个方向的弹层不支持侧边靠齐 2)不对屏幕边界适配 3)支持弹层外边点击自动隐藏 4)支持…

重学SpringBoot3-集成Redis(八)之限时任务(延迟队列)

更多SpringBoot3内容请关注我的专栏&#xff1a;《SpringBoot3》 期待您的点赞&#x1f44d;收藏⭐评论✍ 重学SpringBoot3-集成Redis&#xff08;八&#xff09;之限时任务&#xff08;延迟队列&#xff09; 1. 延迟任务的场景2. Redis Sorted Set基本原理3. 使用 Redis Sorte…

粗糙表面的仿真和处理软件

首款基于粗糙表面的仿真和处理软件&#xff0c;该软件具有三种方法&#xff0c;主要是二维数字滤波法&#xff0c;相位频谱法和共轭梯度法。可以分别仿真具有高斯和非高斯分布的粗糙表面&#xff0c;其中非高斯表面利用Johnson转换系统进行变换给定偏度和峰度。对生成的粗糙表面…

Mysql高级篇(下)——数据库备份与恢复

Mysql高级篇&#xff08;下&#xff09;——数据库备份与恢复 一、物理备份与逻辑备份1、物理备份2、逻辑备份3、对比4、总结 二、mysqldump实现逻辑备份1、mysqldump 常用选项2、mysqldump 逻辑备份语法&#xff08;1&#xff09;备份一个数据库&#xff08;2&#xff09;备份…

linux自动挂载tf卡

本人使用的是armbian系统&#xff0c;ssh工具使用的是finalshell&#xff0c;挂载的是一张64G TF卡。 1.查看系统所检测到的磁盘&#xff0c;这里的 sda1检测到的硬盘但是没有被挂载 lsblk //查看信息 2.在根目录新建一个目录tfcard用于挂载硬盘&#xff0c;命令如下&#xf…

【万字长文】Word2Vec计算详解(一)

【万字长文】Word2Vec计算详解&#xff08;一&#xff09; 写在前面 本文用于记录本人学习NLP过程中&#xff0c;学习Word2Vec部分时的详细过程&#xff0c;本文与本人写的其他文章一样&#xff0c;旨在给出Word2Vec模型中的详细计算过程&#xff0c;包括每个模块的计算过程&a…

电商选品/跟卖| 亚马逊商品类爬取

电商跟卖,最重要是了解哪些商品可以卖, 哪些商品不能卖, 为了更好了解商品信息,我们会经常爬取商品类目的信息. 需求 亚马逊类目信息链接爬虫 打开亚马逊类目信息地址 https://www.amazon.com/gp/new-releases/automotive/refzg_bsnr_nav_automotive_0 一直递归下去&#x…

云原生(四十七) | PHP软件安装部署

文章目录 PHP软件安装部署 一、PHP软件部署步骤 二、安装与配置PHP PHP软件安装部署 一、PHP软件部署步骤 第一步&#xff1a;安装 EPEL 仓库 与 Remi仓库 第二步&#xff1a;启用 Remi 仓库 第三步&#xff1a;安装 PHP、PHP-FPM 第四步&#xff1a;启动并开机启用 PH…

10.8 sql语句查询(未知的)

1.查询结果去重 关键字:distinct (放在查询的后面) AC: select distinct university from user_profile 2.查询结果限制返回行数 关键字:limit AC: select device_id from user_profile limit 0,2 3.将查询后的列重新命名 关键字:as AC: select device_id as user_infos…

wildcard使用教程,解决绝大多数普通人的海外支付难题

许多人可能已经注意到,国外的一些先进AI工具对国内用户并不开放。而想要使用这些工具,我们通常会面临两个主要障碍:一是网络访问的限制,二是支付问题。网络问题很容易解决&#xff0c;难的是如何解决在国内充值海外软件。 今天给大家推荐一个工具——wildcard&#xff0c;用它…

【CSS in Depth 2 精译_046】7.1 CSS 响应式设计中的移动端优先设计原则(下)

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第一章 层叠、优先级与继承&#xff08;已完结&#xff09; 1.1 层叠1.2 继承1.3 特殊值1.4 简写属性1.5 CSS 渐进式增强技术1.6 本章小结 第二章 相对单位&#xff08;已完结&#xff09; 2.1 相对…

StoryMaker: Towards Holistic Consistent Characters in Text-to-image Generation

https://arxiv.org/pdf/2409.12576v1https://github.com/RedAIGC/StoryMaker 问题引入 针对的是文生图的模型&#xff0c;现在已经有方法可以实现指定人物id的情况下进行生成&#xff0c;但是还没有办法保持包括服装、发型等整体&#xff0c;本文主要解决这个问题&#xff1b…