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

2PC和3PC的区别是什么

2PC提交协议是什么

二阶段提交是指,在计算机网络一级数据库领域内,为了使基于分布式系统的架构下的所有节点在进行事务提交时保持一致性而设计的一种算法。在分布式系统中,每个节点虽然可以知晓自己操作的成功和失败,但是无法知道其他节点的操作成功或者失败。当一个事务需要跨越多个节点时,为了保持事务的ACID特性,需要引入一个作为协调者的组件来统一掌控所有节点(称作参与者)的操作并最终指示这些节点是否需要把操作结果真正的提交(比如把更新后的数据写入磁盘等等)。
因此,二节点提交的算法思路可以概括为:参与者将操作成败通知协调者,再由协调者根据所有参与者的反馈情况决定各个参与者是否要提交操作害还是终止操作。

准备阶段

事务协调者给每个参与者发送prepare消息,每个参与者要么直接返回失败(如权限验证失败),要么在本地执行事务,写本地的redo和undo日志,但不提交。
可以将准备阶段分为以下三个步骤:
(1)协调者节点向所有参与者节点询问是否可以执行提交操作,并等待各个节点的响应。
(2)参与者节点执行询问发起为止的所有事务操作,并将Undo和Redo信息写入日志。(若成功这里其实每个参与者就已经执行了事务操作)。
(3)各参与者节点相应协调者节点发起的询问。如果参与者的事务实际操作成功,则返回一个同意消息,否则返回终止消息。

提交阶段

如果协调者受到了参与者的失败消息或者超时,则直接给每个参与者发送回滚(Rollback)消息;否则,则发送提交(commit)消息;参与者根据协调者的指令执行提交或者回滚操作,释放所有事务处理过程中的锁资源。(注意;必须在最后阶段释放锁资源)。

2PC提交协议有什么缺点

(1)同步阻塞问题。执行过程汇总,所有参与节点都是事务阻塞型的。当参与者占用公共资源时,其他第三方节点访问公共资源不得不处于阻塞状态。
(2)单点故障。由于协调者的重要性,一旦协调者发生故障。参与者会一直阻塞下去。尤其在第二阶段,协调者发生故障,那么所有的参与者都还处于锁定事务资源的状态中,而无法继续完成事务操作。(如果是协调者挂掉,可以重新选举一个协调者,但是无法解决因为协调者宕机导致的参与者处于阻塞状态的问题)。
(3)数据不一致。在二阶段提交的阶段二中,当协调者向参与者发送commit请求后,发生了局部网络异常或者在发送commit请求过程中协调者发生了故障,这会导致只有一部分参与者接受到了commit请求。而在这部分参与者接到commit请求之后就会执行commit操作。但是其他部分未接到commit请求的机器则无法执行事务提交。于是整个分布式系统便出现了数据部一致性的现象。
(4)二阶段无法解决的问题:协调者在发出commit消息之后宕机,而唯一接收到这条消息的参与者同时也宕机了。那么即使协调者通过选举协议产生了新的协调者,这条事务的状态也是不确定的,没人知道事务是否被已经提交。

3PC提交协议是什么?

CanCommit阶段

3PC的cancommit阶段其实和2PC的准备阶段很像。协调者向参与者发送commit请求,参与者如果可以提交就返回Yes响应,否则就返回No响应。
(1)事务询问 协调者向参与者发送CanCommit请求,参与者如果可以提交就返回yes,否则就返回no。
(2)响应反馈 参与者接到CanCommit请求之后,正常情况下,如果其自身认为可以顺利执行事务,则返回yes,进入预备状态,否则反馈no。

PreCommit阶段

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

假如协调者从所有的参与者获得的反馈都是Yes响应,那么就会执行事务的预执行。
(1)发送预提交请求 协调者向参与者发送PreCommit请求,并进入Prepared阶段。
(2)事务预提交 参与者接收到PreCommit请求后,会执行事务操作,并将undo和redo信息记录到事务日志中。

假如有任何一个参与者向协调者发送了no响应,或者等待超时之后,协调者都没有受到参与者的响应,那就执行事务中断。
(1)发送中断请求 协调者向所有参与者发送abort请求。
(2)中断事务 参与者受到来自协调的中断请求后,或者超时之后,执行事务的中断。

DoCommit阶段

该阶段真正的进行事务的提交,也可以分为两种情况。
第一种情况:正常执行提交
(1)发送提交请求 协调接收到参与者发送的ACK响应,那么他将从预提交状态进入到提交状态。并向所有参与者发送doCommit请求。
(2)事务提交 参与者接收到doCommit请求之后,执行正式的事务提交。并在完成事务提交之后释放所有事务资源。
(3)响应反馈 事务提交完之后,向协调者发送Ack响应。
(4)完成事务 协调者接收到所有参与者的ack响应之后,完成事务。
第二种情况:中断事务 协调者没有接收到参与者发送的ACK响应(可能是接受者发送的不是ACK响应,也可能响应超时),那么就会执行中断事务。
(1)发送中断请求 协调者向所有参与者发送abort请求。
(2)事务回滚 参与者接收到abort请求之后,利用其在阶段二记录的undo信息来执行事务的回滚操作,并在完成回滚之后释放所有的事务资源。
(3)反馈结果 参与者完成事务回滚之后,向协调者发送ACK消息
(4)中断事务 协调者接收到参与者反馈的ACK消息之后,执行事务的中断。

2PC和3PC的区别是什么?

1、引入超时机制。同时在协调者和参与者中都引入超时机制。

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

3pc比t2pc多了—个can commit阶段,减少了不必要的资源浪费。因为2pC在第一阶段会占用资源,而3pc在这
个阶段不占用资源,只是校验一下sql,如果不能执行,就直接返回,减少了资源占用。
引入超时机制。同时在协调者和参与者中都引1入超时机制。
2pc:只有协调者有超时机制,超时后,发送回滚指令。
3pc:协调者和参与者都有超时机制。
协调者超时:can commit, pre commit中,如果收不到参与者的反馈,则协调者向参与者 发送中断指令。
参与者超时:pre commit 阶段,参与者进行中断;do commit 阶段,参与者进行提交。误杀通过人工补偿来处理。

相关文章:

2PC和3PC的区别是什么

2PC提交协议是什么 二阶段提交是指,在计算机网络一级数据库领域内,为了使基于分布式系统的架构下的所有节点在进行事务提交时保持一致性而设计的一种算法。在分布式系统中,每个节点虽然可以知晓自己操作的成功和失败,但是无法知道…...

redis未设置密码被植入挖矿脚本

最近一台测试linux响应速度贼慢,检查发现cpu消耗高达100%!查看进程杀死后过段时间又重启了,一时间也摸不到头绪。无意间发现启动redis的时候cpu瞬间拉到了100%,主要就是zzh和newinit.sh两个脚本。百度了一下说是被植入了挖矿脚本&…...

轮询--一起学习吧之架构

一、定义 轮询(Polling)是一种CPU决策如何提供周边设备服务的方式,又称“程控输出入”(Programmed I/O)。这种方式是由CPU定时发出询问,依序询问每一个周边设备是否需要其服务,有即给予服务&am…...

【开发工具】Git模拟多人开发场景理解分支管理和远程仓库操作

我们来模拟一个多人多分支的开发场景。假设你有一个新的空白远程仓库,假设地址是 https://github.com/user/repo.git。 克隆远程仓库到本地 $ git clone https://github.com/user/repo.git这会在本地创建一个 repo 目录,并自动设置远程主机为 origin。 创建本地开发分支并推送…...

从零学习Linux操作系统 第三十一部分 ansible常用模块介绍

一、ansible运行模块的两种方式 Ad-Hoc方式 ##利用ansible命令直接完成管理,主要用于临时命令使用场景 playbook方式 ##ansible脚本,主要用于大型项目场景,需要前期的规划,相当于shell当中的脚本 二、如何查看模块帮助 ansible…...

【Linux C | 网络编程】多播的概念、多播地址、UDP实现广播的C语言例子

😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C、数据结构、音视频🍭 🤣本文内容🤣&a…...

HarmonyOS NEXT应用开发案例——滑动页面信息隐藏与组件位移效果

介绍 在很多应用中,向上滑动"我的"页面,页面顶部会有如下变化效果:一部分信息逐渐隐藏,另一部分信息逐渐显示,同时一些组件会进行缩放或者位置移动。向下滑动时则相反。 效果图预览 使用说明 向上滑动页面…...

ffmpeg 转码过程中参数含义

ffmpeg 转码过程中参数含义 frame 649 fps 73 q28.0 size 3072kB time00:00:25.88 bitrate 972.4kbits/ frame 694 fps 74 q28.0 size 3328kB time00:00:27.68 bitrate 984.9kbits/ frame 732 fps 74 q28.0 size 3584kB time00:00:29.20 bitrate1005.5kbits/ fram…...

探索c++——了解c++的魅力

前言:c是一门既面向对象又面向过程的语言。 不同于java纯粹的面向对象和c纯粹的面向过程。 造成c该特性的原因是c是由本贾尼大佬在c的基础上增添语法创建出来的一门新的语言。 它既兼容了c, 身具面向过程的特性。 又有本身的面向对象的特性。 面向对象和…...

Oracle常用语句语法

1 第一章Oracle命令 转载至 Oracle常用语句语法汇总 https://www.modb.pro/db/1759752946170548224 a) 系统管理员连接 conn */* as sysdba b) 查询当前用户 show user c) 创建新用户 create user 用户名 identified by 密码(密码不能以数字开头)。例如…...

时隔n年再度会看Vue,Git

时隔n年再度会看Vue,Git 曾经沧海难为水,除却巫山不是云。不知道这句话用在这里合不合适,好多东西在记忆中都淡化了。但是互联网确是有记忆的。研究以前项目的时候,翻看到gitee码云上托管的项目,就像是自己的孩子重新又回来了一样…...

SpringCloud-Zuul网关的使用

在SpringCloud中网关Zuul起什么作用? 在Spring Cloud中,Zuul 是一个边缘服务网关,起着以下作用:反向代理:Zuul 可以作为应用程序的反向代理服务器,接收客户端请求并将请求转发给相应的服务。这使得客户端可…...

mysql 中的一些重要函数

show create table user_profile 查看表结构 1.datediff(end_date,start_date)函数,now(), curdate() curtime() date_add(日期,interval num 时间) date_format(日期,格式) 4.select IFNULL(null,0); oracle 中nvl 函数 5.select IF(2 > 1, 2,0)&#xff…...

windows11配置电脑IP

windows11配置电脑IP 选择"开始>设置>“网络&Internet >以太网”。在 "属性"下,编辑IP地址,子网掩码,网关以及DNS。...

【JavaEE】_前端POST请求使用json向后端传参

目录 1. 关于json 2. 通过Maven仓库,将Jackson下载导入到项目中 3. 使用Jackson 3.1 关于readValue方法 3.2 关于Request.class类对象 3.3 关于request对象的属性类型 3.4 关于writeValueAsString 前端向后端传递参数通常有三种方法: 第一种&…...

大语言模型系列-GPT-2

文章目录 前言一、GPT-2做的改进二、GPT-2的表现总结 前言 《Language Models are Unsupervised Multitask Learners,2019》 前文提到,GPT-1利用不同的模型结构微调初步解决了多任务学习的问题,但是仍然是预训练微调的形式,GPT-…...

30m二级分类土地利用数据Arcgis预处理及获取

本篇以武汉市为例,主要介绍将土地利用数据转换成武汉市内各区土地利用详情的过程以及分区统计每个区内各地类面积情况,后面还有制作过程中遇到的面积制表后数据过小的解决方法以及一些相关的知识点: 示例数据下载链接:数据下载链…...

LeetCode-22题:括号生成(原创)

【题目描述】 数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。 【题目链接】. - 力扣(LeetCode) 【解题代码】 package dp;import java.util.ArrayList; import java.util.Arrays; im…...

如何应对IT服务交付中的问题?看了本文DevOps就懂了

👨‍🎓博主简介 🏅云计算领域优质创作者   🏅华为云开发者社区专家博主   🏅阿里云开发者社区专家博主 💊交流社区:运维交流社区 欢迎大家的加入! 🐋 希望大家多多支…...

Ubuntu23.10禁用Wayland

禁用前 编辑custom.conf文件 sudo vim /etc/gdm3/custom.conf 去掉WaylandEnablefalse前的#号 保存退出 重启系统 生效: 成功转换为X11...

uniapp 对接腾讯云IM群组成员管理(增删改查)

UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...

云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?

大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...

<6>-MySQL表的增删查改

目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表&#xf…...

脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)

一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法

深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...

Qt Http Server模块功能及架构

Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互

引擎版本: 3.8.1 语言: JavaScript/TypeScript、C、Java 环境:Window 参考:Java原生反射机制 您好,我是鹤九日! 回顾 在上篇文章中:CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3

一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...

Device Mapper 机制

Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...