大数据分布式事务的深入理解?

news/2024/4/27 18:31:19/文章来源:https://blog.csdn.net/2301_79551573/article/details/136967856

        在一个大数据系统内部分布式事务无处不在,但凡一个任务分布到多台机器上执行就会涉及到分布式事务的场景,分布式事务一直以来都是分布式系统比较难以解决的问题。

        事务的理解,比如你要将账户A转1块钱到账户B中,那么这个行为在执行时会被拆分成两个步骤,第一步是将A账户扣掉1块钱,第二步就是将B账户加上1块钱;但是这两个步骤的特点是:要么都执行成功,要么都执行失败,不能存在一个成功一个失败的情况。我们把这种多个步骤要么同时执行成功,要么同时执行失败,不允许出现中间状态的操作就叫做事务。

        本地事务的理解,拿上面的转账例子来说,如果刚好A账户和B账户在同一家银行的同一个数据库里,那么他就满足了一个本地事务的基本条件;也就是说我要执行这两个账户的加减操作只需要在一个程序中就能完成,而且这两个操作彼此之间的顺序和结果是可知的,那么我们在程序内部就可以很容易实现这个事务操作;

        但是如果A账户跟B账户分别在两家不同银行的不同数据库中就没有办法做到像刚才那样在同一个程序里同时去操作A账户和B账户了,我们只能先在A账户对应的银行进行第一步操作,然后再在B账户对应的银行里进行第二步操作,但还会有个问题需要注意那就是操作A账户跟操作B账户这两个操作彼此之间的结果和顺序是不可见的,而这就是分布式事务的场景;此时就只能找一个中间人来帮忙协调这个事情,而这个中间人就是银联,于是我们只需要把转账这个行为告诉银联,然后银联来具体负责向A银行账户扣钱再去B银行的账户加钱;但是这个过程其实相比于刚才的本地事务要复杂的多,因为涉及到了三方的沟通,银行A、银行B、银联,这里面一旦有某一环节处理不好就容易导致A、B账户金额的不一致;那么为了保证分布式事务的可靠性就出现了两阶段提交和三阶段提交的实现方案。

        两阶段提交就是把这个多方沟通协调的过程根据沟通顺序划分为两个阶段;提交就是把写在内存中的数据再次写入到磁盘中;回滚是把在内存中修改的数据进行撤销。A账户跨行向B账户转账,第一阶段为银联收到转账申请后先向A账户所在银行发起扣钱操作,A只执行不提交也就是只在内存中对金额进行扣减但是不写入到磁盘中然后把执行成功的消息告诉银联,接着银联再向B的所在的银行发起加钱操作也只是在内存中对账户金额进行增加并不写入磁盘,然后再把执行成功的消息也告诉银联,第一阶段也可称为投票阶段,如果A、B操作都成功则投票成功,否则为失败。然后是分布式事务的第二个阶段,当银联分别收到A、B银行的操作反馈之后,确保所有步骤都没有问题便开始向A银行和B银行发出提交通知,让A银行和B银行分别将刚才在内存中修改的金额写入到磁盘中进行持久化,而这个阶段就叫做事务的提交阶段。如果两个阶段其中任何一个阶段一旦出现了某个操作的失败,那么银联就会在第一时间想办法不让A、B的账户余额变化写入磁盘中,就是进行事务的回滚操作,两阶段提交是用来保证分布式事务一致性的一种策略,但也有一些不完善的地方,然后就有三阶段提交。

        三阶段提交比两阶段提交多了一个事务开始前的询问阶段,比如当银联决定开始对A、B账户进行转账操作前,为了严谨他会先询问A、B账户所在的银行当前是否可以执行对应账户余额的增减操作,如果当前A银行或者B银行的数据据刚好在维护或者升级,那么就可以第一时间通过这个第一阶段的询问来得知,这样就可以提前终止本次转账操作,这么做的好处在于提前对各个要通讯的对象系统状况有个初步的了解,如果通信对象存在网络故障、系统负载过高等问题就可以提前知道避免了后续无谓的操作,而剩下的两个阶段跟两阶段提交的步骤基本一致,三阶段提交还优化了两阶段提交的超时机制,比如在原来等银联发送提交通知给A、B银行时如果协调者银联挂了,那么银行A和银行B就只能在那里等待并等银联恢复通信;而三阶段提交的机制则优化了这一点,如果最后一个阶段银联因为各种原因无法正常通信超过一段等待时间后那么银行A和银行B就可以在不用收到银联提交通知的情况下自己完成各自的提交操作,从而进一步提高分布式事务的一致性成功率。

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

各种需要使用的方法-->vue/微信小程序/layui

各种需要使用的方法-->vue/微信小程序/layui 1、vue里样式不起作用的方法,可以通过deep穿透的方式2、 js获取本周、上周、本月、上月日期3、ArrayBuffer Blob 格式转换ArrayBuffer与Blob的区别ArrayBuffer转BlobBlob转ArrayBuffer需要借助fileReader对象 4、使用…

STM32使用滴答定时器实现delayms

在STM32上使用SysTick实现jiffies(时间戳)并且实现delay_ms 代码实现: volatile uint32_t jiffies 0; // 用于记录系统运行的jiffies数 void SysTick_Handler(void) {/* 每次SysTick中断,jiffies增加 */jiffies; }uint32_t tick…

如何利用生成式人工智能挑选合适的候选人?

在当今激烈的商业竞争中,招聘合适的人才是构建企业成功的基石。筛选和面试候选人是一个复杂且精细的过程,它不仅关系到职位的有效填补,更影响到企业的长期发展和团队建设。 选择合适候选人的重要性 选择合适的候选人就像寻找一片沙滩上的珍…

曲线生成 | 图解Reeds-Shepp曲线生成原理(附ROS C++/Python/Matlab仿真)

目录 0 专栏介绍1 什么是Reeds-Shepp曲线?2 Reeds-Shepp曲线的运动模式3 Reeds-Shepp曲线算法原理3.1 坐标变换3.2 时间翻转(time-flip)3.3 反射变换(reflect)3.4 后向变换(backwards) 4 仿真实现4.1 ROS C实现4.2 Python实现4.3 Matlab实现 0 专栏介绍 &#x1f5…

MP4如何把视频转MOV格式? MP4视频转MOV格式的技巧

在现代的数字媒体时代,视频格式转换成为了许多用户必须掌握的技能。特别是将MP4视频转换为MOV格式,这对于需要在Apple设备上播放或编辑视频的用户来说尤为重要。本文将详细介绍如何将MP4视频转换为MOV格式,帮助读者轻松应对不同设备和平台的需…

编程语言|C语言——C语言基本数据类型

前言 针对不同的数据,采取不同的存储方式和进行不同的处理。随着处理对象的复杂化,数据类型也要变得更丰富。数据类型的丰富程度直接反映了程序设计语言处理数据的能力。 C语言很重要的一个特点是它的数据类型十分丰富。因此,C语言程序数据处…

【Nuxt3】modules目录和nuxt3模块的简单介绍

简言 记录下nuxt3项目中module的用法 modules目录 使用 modules/ 目录在应用程序中自动注册本地模块。 这是一个很好的地方,可以放置您在构建应用程序时开发的任何本地nuxt模块。 nuxt模块相当于npm包,可以发布到npm社区中 在modules/ 目录下的本地模…

二叉树|654.最大二叉树

力扣题目地址 class Solution { public:TreeNode* constructMaximumBinaryTree(vector<int>& nums) {TreeNode* node new TreeNode(0);if (nums.size() 1) {node->val nums[0];return node;}// 找到数组中最大的值和对应的下标int maxValue 0;int maxValueIn…

Kubernetes生产集群部署指南

部署生产就绪的Kubernetes集群需要考虑到管理、负载均衡、安全、存储等很多细节&#xff0c;本文给出了一个生产就绪Kubernetes集群的完整部署流程&#xff0c;可以作为生产部署的有效参考。原文: Deploying a Production Kubernetes Cluster in 2023 — A Complete Guide Grow…

万兆车载以太网转换器 10G/2.5G多速车载以太网转换器-MC10GM

MC10GM转换器 一、产品简要分析 2.5G,5G,10G可切换万兆/多速车载以太网转换器。采用罗森博格H-MTD标准接口类型。实现将车载以太网标准2.5/5/10G BASE-T1转换为工业级2.5/5/10G 标准以太网&#xff0c;进而接入电脑或工控机. 产品实现2.5/5/10G Base-T1 和2.5/5/10G Base-R之间…

android Fragment 生命周期 方法调用顺序

文章目录 Introlog 及结论代码 Intro 界面设计&#xff1a;点击左侧按钮&#xff0c;会将右侧 青色的RightFragment 替换成 黄色的AnotherRightFragment&#xff0c;而这两个 Fragment 的生命周期方法都会打印日志。 所以只要看执行结果中的日志&#xff0c;就可以知道 Fragme…

CSS时钟案例

文章目录 1. 演示效果2. 分析思路3. 代码实现 1. 演示效果 2. 分析思路 背景是表盘&#xff0c;不用自己制作然后用CSS的定位做时针&#xff0c;分针和秒针黑点用伪元素::after生成转动用animation实现 3. 代码实现 <!DOCTYPE html> <html lang"en">&…

【详细讲解React 快速入门教程】

&#x1f525;博主&#xff1a;程序员不想YY啊&#x1f525; &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家&#x1f4ab; &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 &#x1f308;希望本文对您有所裨益&#xff0c;如有…

Python中的变量与常量

变量&#xff1a;在程序运行过程中&#xff0c;值会发生变化的量&#xff0c; 常量&#xff1a;在程序运行过程中&#xff0c;值不会发生变化的量。 无论是变量还是常量&#xff0c;在创建时都会在内存中开辟一块空间&#xff0c;用于保存它的值。 Python 中的变量不需要声明…

数据链路层协议之以太网协议

以太网协议是通过网线/光纤进行通信。这和通过wifi&#xff08;无线&#xff09;&#xff0c;通过移动流量&#xff08;4G/5G&#xff09;通信不一样。以太网&#xff0c;横跨数据链路层和物理层 一.以太网数据帧格式 包括了帧头载荷(IP数据报)帧尾。 1.目的地址 源地址 分别…

初探Flink集群【持续更新】

周末下雨&#xff0c;倒杯茶&#xff0c;在家练习Flink相关。 开发工具&#xff1a;IntelliJ Idea 第一步、创建项目 打开Idea&#xff0c;新建Maven项目&#xff0c;包和项目命名 在pom.xml 文件中添加依赖 <properties><flink.version>1.13.0</flink.vers…

【Redis主从架构。主从工作原理psync、bgsave、部分数据复制、主从复制风暴解决方案】【Redis哨兵高可用架构。sentinel】

Redis主从架构 Redis主从工作原理数据部分复制 Redis哨兵高可用架构client连接哨兵规则主节点挂了&#xff0c;集群从新选择主节点&#xff0c;并且同步给sentinel 转自图灵课堂 redis主从架构搭建&#xff0c;配置从节点步骤&#xff1a; 1、复制一份redis.conf文件2、将相关…

六大原则与设计模式

1. 六大原则 1.1 单一原则&#xff08;SRP&#xff09; 应该有且仅有一个原因引起类的变更 1. 复杂性降低&#xff0c;可读性高&#xff0c;可维护性提高 2. 变更引起的风险降低&#xff0c;变更是必不可少的&#xff0c;如果接口的单一职责做得好&#xff0c;一个接口修改…

基于单片机多功能智能台灯设计

**单片机设计介绍&#xff0c;基于单片机多功能智能台灯设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的多功能智能台灯设计是一个集硬件与软件于一体的综合性项目&#xff0c;旨在为用户提供更加便捷、舒适和节…

如何借用 NTFS 交换数据流 实现隐藏文件?如何使用【文件包含】PHP伪协议?不同操作系统如何实现文件隐藏和木马伪装?

如何借用 NTFS 交换数据流 实现隐藏文件?如何使用【文件包含】PHP伪协议?不同操作系统如何实现文件隐藏和木马伪装? NTFS交换数据流(Alternate Data Streams, ADS)是NTFS文件系统特有的一种功能,它允许在同一个文件名下存储多个数据流。除了默认的数据流(通常用于存储文…