面试题:两阶段提交与三阶段提交的区别?

news2024/11/23 6:54:06

主要区别有以下几点:

  • 增加了一个询问阶段,问了下,你能不不能行?
  • 加入了超时机制

2PC(二阶段提交协议)

2PC,两阶段提交,将事务的提交过程分为资源准备和资源提交两个阶段,并且由事务协调者来协调所有事务参与者,如果准备阶段所有事务参与者预提交成功,则进行第二阶段的资源提交,否则事务协调者回滚资源

1、第一阶段:预提交阶段

由事务协调者询问通知各个事务参与者,是否准备好了执行事务,具体流程图如下:

  • ① 协调者向所有参与者发送事务内容,询问是否可以提交事务,并等待答复

  • ② 各参与者执行本地事务操作,将 undo 和 redo 信息记入事务日志中(但不提交事务)

  • ③ 如参与者执行成功,给协调者反馈同意,否则反馈中止,表示事务不可以执行

undo一般用于事务的记取消与回滚,录的是数据修改前的值;

redo一般用于恢复已确认但未写入数据库的数据,记录的是数据修改后的值。

2、第二阶段:提交阶段

协调者收到各个参与者的准备消息后,根据反馈情况通知各个参与者commit提交或者rollback回滚

接下来分两种情况分别讨论提交阶段的过程。

(1)事务提交:

当第一阶段所有参与者都反馈同意时,协调者发起正式提交事务的请求,当所有参与者都回复同意时,则意味着完成事务,具体流程如下:

① 协调者节点向所有参与者节点发出正式提交的 commit 请求。

② 收到协调者的 commit 请求后,参与者正式执行事务提交操作,并释放在整个事务期间内占用的资源。

③ 参与者完成事务提交后,向协调者节点发送ACK消息。

④ 协调者节点收到所有参与者节点反馈的ACK消息后,完成事务。

所以,正常提交时,事务的完整流程图如下:

(2)事务回滚:

如果任意一个参与者节点在第一阶段返回的消息为中止,或者协调者节点在第一阶段的询问超时之前无法获取所有参与者节点的响应消息时,那么这个事务将会被回滚,具体流程如下:

① 协调者向所有参与者发出 rollback 回滚操作的请求

② 参与者利用阶段一写入的undo信息执行回滚,并释放在整个事务期间内占用的资源

③ 参与者在完成事务回滚之后,向协调者发送回滚完成的ACK消息

④ 协调者收到所有参与者反馈的ACK消息后,取消事务

所以,事务回滚时,完整流程图如下:

2PC缺点:

二阶段提交确实能够提供原子性的操作,但是不幸的是,二阶段提交还是有几个缺点的:

(1)性能问题:执行过程中,所有参与节点都是事务阻塞性的,当参与者占有公共资源时,其他第三方节点访问公共资源就不得不处于阻塞状态,为了数据的一致性而牺牲了可用性,对性能影响较大,不适合高并发高性能场景

(2)可靠性问题:2PC非常依赖协调者(带头大哥),当协调者发生故障时,尤其是第二阶段,那么所有的参与者就会都处于锁定事务资源的状态中,而无法继续完成事务操作(如果是协调者挂掉,可以重新选举一个协调者,但是无法解决因为协调者宕机导致的参与者处于阻塞状态的问题)

(3)数据一致性问题:在阶段二中,当协调者向参与者发送commit请求之后,发生了局部网络异常或者在发送commit请求过程中协调者发生了故障,这会导致只有一部分参与者接受到了commit请求。而在这部分参与者接到commit请求之后就会执行commit操作。但是其他部分未接到commit请求的机器则无法执行事务提交。于是整个分布式系统便出现了数据不一致性的现象。

(4)二阶段无法解决的问题:协调者在发出 commit 消息之后宕机,而唯一接收到这条消息的参与者同时也宕机了,那么即使协调者通过选举协议产生了新的协调者,这条事务的状态也是不确定的,没人知道事务是否被已经提交。

3PC(三阶段提交协议)

3PC,三阶段提交协议,是二阶段提交协议的改进版本,三阶段提交有两个改动点:

(1)在协调者和参与者中都引入超时机制

(2)在第一阶段和第二阶段中插入一个准备阶段,保证了在最后提交阶段之前各参与节点的状态是一致的。

所以3PC会分为3个阶段,

CanCommit 准备阶段、(你能不能行?)

PreCommit 预提交阶段、

DoCommit 提交阶段,处理流程如下:

1、阶段一:CanCommit 准备阶段

协调者向参与者发送 canCommit 请求,参与者如果可以提交就返回Yes响应,否则返回No响应,具体流程如下:

(1)事务询问:协调者向所有参与者发出包含事务内容的 canCommit 请求,询问是否可以提交事务,并等待所有参与者答复。

(2)响应反馈:参与者收到 canCommit 请求后,如果认为可以执行事务操作,则反馈 yes 并进入预备状态,否则反馈 no。

2、阶段二:PreCommit 阶段

协调者根据参与者的反应情况来决定是否可以进行事务的 PreCommit 操作。根据响应情况,有以下两种可能:

(1)执行事务:

假如所有参与者均反馈 yes,协调者预执行事务,具体如下:

① 发送预提交请求:协调者向参与者发送 PreCommit 请求,并进入准备阶段

② 事务预提交 :参与者接收到 PreCommit 请求后,会执行本地事务操作,并将 undo 和 redo 信息记录到事务日志中(但不提交事务)

③ 响应反馈 :如果参与者成功的执行了事务操作,则返回ACK响应,同时开始等待最终指令。

(2)中断事务:

假如有任何一个参与者向协调者发送了No响应,或者等待超时之后,协调者都没有接到参与者的响应,那么就执行事务的中断,流程如下:

① 发送中断请求 :协调者向所有参与者发送 abort 请求。

② 中断事务 :参与者收到来自协调者的 abort 请求之后(或超时之后,仍未收到协调者的请求),执行事务的中断。

3、阶段三:doCommit阶段

该阶段进行真正的事务提交,也可以分为以下两种情况:

(1)提交事务:

① 发送提交请求:协调接收到所有参与者发送的ACK响应,那么他将从预提交状态进入到提交状态,并向所有参与者发送 doCommit 请求

② 本地事务提交:参与者接收到doCommit请求之后,执行正式的事务提交,并在完成事务提交之后释放所有事务资源

③ 响应反馈:事务提交完之后,向协调者发送ack响应。

④ 完成事务:协调者接收到所有参与者的ack响应之后,完成事务。

(2)中断事务:

任何一个参与者反馈 no,或者等待超时后协调者尚无法收到所有参与者的反馈,即中断事务

① 发送中断请求:如果协调者处于工作状态,向所有参与者发出 abort 请求

② 事务回滚:参与者接收到abort请求之后,利用其在阶段二记录的undo信息来执行事务的回滚操作,并在完成回滚之后释放所有的事务资源。

③ 反馈结果:参与者完成事务回滚之后,向协调者反馈ACK消息

④ 中断事务:协调者接收到参与者反馈的ACK消息之后,执行事务的中断。

进入doCommit阶段后,无论协调者出现问题,或者协调者与参与者之间的网络出现问题,都会导致参与者无法接收到协调者发出的 doCommit 请求或 abort 请求。此时,参与者都会在等待超时之后,继续执行事务提交。这其实基于概率来决定的,当进入第三阶段时,说明第一阶段收到所有参与者的CanCommit响应都是Yes,意味着大家都同意修改了,并且第二阶段所有的参与者对协调者的PreCommit请求也都是yes的。所以,一句话概括就是,当进入第三阶段时,由于网络超时等原因,虽然参与者没有收到commit或者abort响应,但是他有理由相信:成功提交的几率很大。

3PC的优缺点

与2PC相比,3PC降低了阻塞范围,并且在等待超时后,协调者或参与者会中断事务,避免了协调者单点问题,阶段三中协调者出现问题时,参与者会继续提交事务。

数据不一致问题依然存在,当在参与者收到 preCommit 请求后等待 doCommit 指令时,此时如果协调者请求中断事务,而协调者因为网络问题无法与参与者正常通信,会导致参与者继续提交事务,造成数据不一致。


2PC和3PC都无法保证数据绝对的一致性,一般为了预防这种问题,可以添加一个报警,比如监控到事务异常的时候,人为干预,通过脚本自动补偿差异的信息。

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

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

相关文章

Linux配置双网卡,1NAT 2桥接,ARM板上网

1、简介 版本型号:ubuntu18.04 ARM板型号:6ull本文主要记录配置第一次ubuntu与arm板连接的nfs配置和ARM板上网的配置,按照配置网络、配置nfs系统、给板子连网 顺序进行。该配置的前提是创建ubuntu系统的网络配置选择的是NAT模式&…

算法设计优化——起泡排序

文章目录 0.概述1 起泡排序(基础版)1.1 算法分析1.2 算法实现1.3 重复元素与稳定性1.4 复杂度分析 2 起泡排序(改进版)2.1 目标2.2 改进思路2.3 实现2.4 复杂度分析 3 起泡排序(改进版2)3.1 目标3.1 改进思…

鸿蒙内核源码分析(汇编基础篇) | CPU在哪里打卡上班

本篇通过拆解一段很简单的汇编代码来快速认识汇编,为读懂鸿蒙汇编打基础.系列篇后续将逐个剖析鸿蒙的汇编文件. 汇编很简单 第一: 要认定汇编语言一定是简单的,没有高深的东西,无非就是数据的搬来搬去,运行时数据主要…

基于Spring Boot的体质测试数据分析及可视化系统设计与实现

基于Spring Boot的体质测试数据分析及可视化系统的设计与实现 开发语言:Java框架:springbootJDK版本:JDK1.8数据库工具:Navicat11开发软件:eclipse/myeclipse/idea 系统部分展示 前台首页界面图,体质测试…

day17-day20_项目实战项目部署

万信金融 项目部署 目标: 理解DevOps概念 能够使用Docker Compose部署项目 理解持续集成的作用 会使用Jenkins进行持续集成 1 DevOps介绍 1.1 什么是DevOps DevOps是Development和Operations两个词的缩写,引用百度百科的定义: DevOps…

68.网络游戏逆向分析与漏洞攻防-利用数据包构建角色信息-自动生成CPP函数解决数据更新的问题

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 如果看不懂、不知道现在做的什么,那就跟着做完看效果,代码看不懂是正常的,只要会抄就行,抄着抄着就能懂了 内容…

Seata-server配置

首先先兼容一下版本看看所用的版本是否都兼容 版本兼容查看 建立seata-server数据库 数据库DDL 给每个业务库建立undo.log表 undo.log 然后在虚拟机安装seata-server 创建文件路径,并创建docker-compose.yml文件 创建完成后先启动一下seata docker run -rm seata…

linux远程访问及控制

一、SSH远程管理 1.SSH的简介 SSH远程管理是一种通过 SSH 协议安全地管理远程计算机的方法。允许管理员通过加密的连接从本地计算机或其他远程位置连接到远程计算机,并执行管理任务、配置设置、故障排除等操作。 远程链接的两种方法:SSH 、Telnet S…

07_for循环返回值while循环

文章目录 1.循环返回值2.yield接收for返回值3.scala调用yield方法创建线程对象4.scala中的while循环5.scala中的流程控制 1.循环返回值 for循环返回值是Unit 原因是防止产生歧义; 2.yield接收for返回值 // 2.yield关键字打破循环,可以使for循环输出…

力扣HOT100 - 207. 课程表

解题思路&#xff1a; class Solution {public boolean canFinish(int numCourses, int[][] prerequisites) {int[] inDegree new int[numCourses];//存每个结点的入度List<List<Integer>> res new ArrayList<>();//存结点之间依赖关系Queue<Integer>…

Spring Security(学习笔记)--漏洞保护(csrf攻击与防御以及源码分析)!

重点标识 csrf 攻击防御演示&#xff01; 源码分析&#xff01; CSRF攻击与防御 CSRF是什么 &#xff0c;跨站请求伪造&#xff0c;简单解释一下&#xff0c;就是用户登录某个界面&#xff0c;如银行界面&#xff0c;进行转账&#xff0c;完了之后并没有注销登录&#xff0…

Scrapy 爬虫教程:从原理到实战

Scrapy 爬虫教程&#xff1a;从原理到实战 一、Scrapy框架简介 Scrapy是一个由Python开发的高效网络爬虫框架&#xff0c;用于从网站上抓取数据并提取结构化信息。它采用异步IO处理请求&#xff0c;能够同时发送多个请求&#xff0c;极大地提高了爬虫效率。 二、Scrapy运行原…

蒸镀的氧化硅薄膜为什么有时候是绿色有时候是棕色的?

知识星球&#xff08;星球名&#xff1a;芯片制造与封测社区&#xff0c;星球号&#xff1a;63559049&#xff09;里的学员问&#xff1a;我们用热阻式蒸镀设备镀氧化硅薄膜&#xff0c;出来的颜色有时候会发生变化是什么原因呀&#xff1f;有时候薄膜是绿色有时候是棕色。 氧…

Excel 中用于在一个范围中查找特定的值,并返回同一行中指定列的值 顺序不一样 可以处理吗

一、需求 Excel 中&#xff0c;在一列&#xff08;某范围内&#xff09;查找另一列特定的值&#xff0c;并返回同一行中另一指定列的值&#xff0c; 查找列和返回列的顺序不一样 二、 实现 1、下面是一个使用 INDEX 和 MATCH 函数的例子&#xff1a; 假设你有以下数据&…

网络服务SSH-远程访问及控制

一.SSH远程管理 1.SSH介绍 SSH&#xff08;Secure Shell&#xff09;是一种安全通道协议&#xff0c;最早是由芬兰的一家公司开发出来&#xff0c;并且在IETF &#xff08;Internet Engineering Task Force&#xff09;的网络草案基础上制定而成的标准协议。主要用来实现字符…

深度学习pytorch实战-运动鞋识别P5周

向大佬学习大地之灯第P5周&#xff1a;Pytorch实现运动鞋识别http://t.csdnimg.cn/eVVAG >- **&#x1f368; 本文为[&#x1f517;365天深度学习训练营](https://mp.weixin.qq.com/s/0dvHCaOoFnW8SCp3JpzKxg) 中的学习记录博客** >- **&#x1f356; 原作者&#xff1a…

MySQL8.0新特性

1、新增降序索引 MySQL 5.7&#xff1a;在语法上支持降序索引&#xff0c;但实际上创建的仍然是升序索引 MySQL 8.0&#xff1a;真正支持降序索引&#xff08;只有Innodb存储引擎支持降序索引&#xff09; # MySQL 5.7演示 mysql> create table t1(c1 int,c2 int,index i…

pytest教程-34-钩子函数-pytest_configure

领取资料&#xff0c;咨询答疑&#xff0c;请➕wei: June__Go 上一小节我们学习了pytest_addoption钩子函数的使用方法&#xff0c;本小节我们讲解一下pytest_configure钩子函数的使用方法。 pytest_configure(config) 是一个 pytest 钩子函数&#xff0c;它在 pytest 配置完…

资产管理软件价格 一套固定资产管理系统多少钱

固定资产管理系统作为一款帮助工厂、事业单位、政府机关等企业管理资产设备的管理工具&#xff0c;其实&#xff0c;一直在向企业提供着各种相关的服务&#xff0c;对于才接触固定资产管理系统的朋友们来说&#xff0c;首先想要了解的这个付费工具的收费问题&#xff0c;那这个…

关于谷歌浏览器对于https的证书不通过校验的无法跳转的问题

谷歌浏览器对于https的证书问题会出现如下提示: 解决方法: 直接在页面输入 thisisunsafe 就能跳转了.