二阶段提交(2pc)协议

二阶段提交(2pc)协议

1、 简介

二阶段提交算法是一个分布式一致性算法,强一致、中心化的原子提交协议,主要用来解决分布式事务问题。在单体spring应用中我们往往通过一个@Transactional注解就可以保证方法的事务性,但是在分布式场景下,serviceA往往会调用serviceB和ServiceC等有自己单独数据库的服务。如果serviceb成功了,servicec失败了,这种情况的回滚就需要用到分布式事务了。
在这里插入图片描述

2阶段提交包含两个阶段,即准备阶段和提交阶段。包含俩种角色,即协调者(Coordinator)和参与者(Participant)。协调者它就是协调整个事务的提交和回滚这两个操作,而参与者呢就是这个分布式事务中的事务资源拥有者。那么事务资源怎么去理解呢?图中的ServiceA可以类比为协调者,ServiceB和ServiceC类比为参与者。当SeriveB和ServiceC都执行成功后,协调者ServiceA才会提交本次的分布式事务。

2、 2pc第一阶段

准备阶段,是用于协调者通过Prepare消息,通知参与者去锁定一些事务资源。在下图这个案例中,第一步客户端它发起一个分布式事务给协调者,协调者就会广播Prepare请求给所有的参与者。所有的参与者收到这个操作之后呢它就会在本地记录一个事务日志,undo和redo日志。在这个过程中的所有的参与者也会锁定本次分布式事务,需要用到的一些事务资源。它会根据这个需要锁定的事务资源它会尝试去执行,如果它能够执行的话它就给协调者反馈一个yes的响应。如果不能够执行的话,它就反馈一个no响应。因为我们的参与者会给协调者一个yes或者no响应,二阶段提交也是分为两种情况,一种是提交,一种是回滚。当我们的协调者收到所有的参与者的响应都是yes的时候,它就会执行一个提交操作。然后进入到第二阶段。
第一阶段

3、 2pc第二阶段

第二阶段的协调者会向所有的参与者广播这个global commit消息,这个消息就是通知所有的参与者你可以提交本次的分支事务了。所有的参与者收到这个global commit消息之后,它就会根据第一阶段记录这个redo日志它就会提交本地的分支事务。提交成功之后,它就会返回一个ack响应给协调者,协调者收到所有的参与者成功的响应之后,它就会给客户端返回成功,也就是说本次的分布式事务呢就提交成功了。如果协调者在第一阶段的时候收到有一个参与者返回为no的情况的话,那它就会进入到global rollback的阶段也就是说全局回滚的阶段,协调者会向所有的参与者发送一个global rollback消息,每个参与者收到这个global rollback消息之后,它就会根据第一个阶段记录的undo日志,回滚到执行本次全局事务之前的状态,回滚成功之后它会给协调者返回一个ack响应,协调者收到所有ack后告诉客户端本次全局事务执行失败了。

第二阶段

4、 存在的问题

4.1 同步阻塞问题

一个比较明显的问题呢就是同步阻塞。因为协调者,它需要等待所有的参与者都给它一个yes的响应或者是no响应的时候,它才会进入第二阶段,所以协调者这里有个同步阻塞的问题,协调者要等待所有的参与者响应。而第二个阻塞的问题在于在第二阶段的过程中,参与者必须要等待协调者的global commit消息 或者是global rollback消息之后它才会执行第二阶段,因为第一阶段prepare的时候,参与者锁定了本次分支事务的事务资源,锁定了事务资源后其他事务时不能访问的,如果协调者宕机了,没法通知参与者去执行第二阶段,那么参与者就释放不了事务资源。

4.2 2PC模型中可能出现的数据不一致问题

在2PC模型中,第一阶段是准备阶段。在这个阶段,协调者向参与者发送准备请求,要求参与者准备进行事务提交。

如果协调者在第一阶段崩溃,以下情况可能发生:

  1. 参与者等待超时:
    参与者可能一直等待协调者的消息,如果协调者崩溃,参与者可能会无限期地等待下去。
  2. 参与者提交事务:
    在第一阶段中,参与者接收到准备请求后,会将事务准备好以等待提交。如果协调者崩溃后,参与者可能会提交自己的事务,因为它无法得知协调者是否要求回滚事务。

由于以上情况,数据不一致的情况是可能发生的。如果协调者崩溃,部分参与者可能已经提交了事务,而其他参与者可能还在等待或者准备回滚事务。这种情况下,数据在不同参与者之间就会不一致。因此,在第一阶段中,协调者的崩溃可能导致数据不一致的情况发生。

4.3单点故障:

2PC算法中的协调者节点是一个关键节点。如果协调者节点发生故障,整个系统将无法继续进行任务的提交,因为参与者节点需要等待协调者的指令。这种单点故障可能导致系统的可用性降低。

4.4脑裂(Split-Brain)问题:

在某些情况下,如果网络分区或故障导致协调者和参与者之间的通信中断,系统可能会出现脑裂现象。即,一部分参与者可能收到了提交请求并执行了事务,而另一部分参与者则没有收到请求并保持原始状态,从而导致数据不一致。

4.5过于保守

任何一个参与者出现问题,都会影响整个事务的进程。

为了解决这些问题,人们提出了多种改进方案,如三阶段提交协议(3PC)和基于Paxos或Raft等算法的分布式一致性协议。这些改进方案在保持数据一致性的同时,也试图降低阻塞、单点故障和数据不一致的风险,并提高系统的性能和可用性。

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

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

相关文章

破解发展难题 台山这家合作社以农业社会化服务助推乡村振兴

风吹稻田千层浪,眼下,台山四九镇的早稻长势喜人,沉甸甸的稻穗迎风而动,已进入破口抽穗的关键期,即将在6月底陆续迎来丰收。在台山市明华汇种养专业合作社管理的稻田里,合作社负责人梁明喜正仔细观察着稻苗的…

算法第六天:力扣第977题有序数组的平方

一、977.有序数组的平方的链接与题目描述 977. 有序数组的平方的链接如下所示:https://leetcode.cn/problems/squares-of-a-sorted-array/description/https://leetcode.cn/problems/squares-of-a-sorted-array/description/ 给你一个按 非递减顺序 排序的整数数组…

#慧眼识模每日PK[话题]##用五种语言说爸爸我爱你[话题]#

#慧眼识模每日PK #用五种语言说爸爸我爱你 你觉得哪个模型回答得更好?欢迎留言 A.蓝 B.紫 更多问题,扫码体验吧~ by 国家(杭州)新型交换中心

Whisper语音识别 -- 自回归解码分析

前言 Whisper 是由 OpenAI 开发的一种先进语音识别系统。它采用深度学习技术,能够高效、准确地将语音转换为文本。Whisper 支持多种语言和口音,并且在处理背景噪音和语音变异方面表现出色。其广泛应用于语音助手、翻译服务、字幕生成等领域,为…

鸿蒙轻内核A核源码分析系列七 进程管理 (3)

本文记录下进程相关的初始化函数,如OsSystemProcessCreate、OsProcessInit、OsProcessCreateInit、OsUserInitProcess、OsDeInitPCB、OsUserInitProcessStart等。 1、LiteOS-A内核进程创建初始化通用函数 先看看一些内部函数,不管是初始化用户态进程还…

收银系统小程序商城商品详情页再升级!

本期导读 1.新增:商品详情页新增商品参数模块; 2.新增:商品详情页新增保障服务模块; 3.新增:线上商城商品新增划线价; 4.新增:线上商城分销商品新增“赚”字标签及预收收益; 5.…

Linux-笔记 全志平台OTG虚拟 串口、网口、U盘笔记

前言: 此文章方法适用于全志通用平台,并且三种虚拟功能同一时间只能使用一个,原因是此3种功能都是内核USB Gadget precomposed configurations的其中一个选项,只能单选,不能多选,而且不能通过修改配置文件去…

我的考研经历

当我写下这篇文章时,我已经从考研 的失败中走出来了,考研的整个过程都写在博客日志里面了,在整理并阅读考研的日志时,想写下一篇总结,也算是为了更好的吸取教训。 前期日志模板:时间安排的还算紧凑&#x…

安鸾学院靶场——安全基础

文章目录 1、Burp抓包2、指纹识别3、压缩包解密4、Nginx整数溢出漏洞5、PHP代码基础6、linux基础命令7、Mysql数据库基础8、目录扫描9、端口扫描10、docker容器基础11、文件类型 1、Burp抓包 抓取http://47.100.220.113:8007/的返回包,可以拿到包含flag的txt文件。…

DDei在线设计器-配置主题风格

DDeiCore-主题 DDei-Core插件提供了默认主题和黑色主题。 如需了解详细的API教程以及参数说明,请参考DDei文档 默认主题 黑色主题 使用指南 引入 import { DDeiCoreThemeBlack } from "ddei-editor";使用并修改设置 extensions: [......//通过配置&am…

【FreeRTOS】内存管理

目录 1 为什么要自己实现内存管理2 FreeRTOS的5中内存管理方法2.1 Heap_12.2 Heap_22.3 Heap_32.4 Heap_4 2.5 Heap_53 Heap相关的函数3.1 pvPortMalloc/vPortFree3.2 xPortGetFreeHeapSize 3.3 xPortGetMinimumEverFreeHeapSize3.4 malloc失败的钩子函数 参考《FreeRTOS入门与…

Python私教张大鹏 Vue3整合AntDesignVue之DatePicker 日期选择框

案例&#xff1a;选择日期 <script setup> import {ref} from "vue";const date ref(null) </script> <template><div class"p-8 bg-indigo-50 text-center"><a-date-picker v-model:value"date"/><a-divide…

原子阿波罗STM32F429程序的控制器改为STM32F407驱动LCD屏

原子大神的阿波罗开发板使用STM32F429IGT6控制器&#xff0c;编程风格也与探索者F407系列有了很大的不同&#xff0c;使用BSP功能模块编程了&#xff0c;也有点类似于安富莱的编程风格了。这种模块式程序风格的优点是更加方便移植&#xff0c;更方便泡系统。 但无奈手里只有F40…

模拟笔试 - 卡码网周赛第二十一期(23年美团笔试真题)

第一题&#xff1a;小美的排列询问 解题思路: 简单题&#xff0c;一次遍历数组&#xff0c;判断 是否有和x、y相等并且相连 即可。 可优化逻辑&#xff1a;因为x和y是后输入的&#xff0c;必须存储整个数组&#xff0c;但是上面说了 **排列是指一个长度为n的数组&#xff0…

搭建一个好玩的 RSS 订阅网站记录

全文相关链接 Github仓库创建链接Railway官网Supabase官网f-droid上的co.appreactor.news应用下载链接Railway账户使用量估算链接 全文相关代码 原文地址: https://blog.taoshuge.eu.org/p/270/ Dockerfile FROM docker.io/miniflux/miniflux:2.1.3环境变量 DATABASE_URL…

UniApp或微信小程序中scroll-view组件使用show-scrollbar在真机Android或IOS中隐藏不了滚动条的解决办法

show-scrollbar 属性 不论是使用 变量 还是直接使用 布尔值或者直接使用 css 都是在 ios、Android 上是都没有效果。。 真机中还是出现滚动条 解决办法 添加下面CSS ::-webkit-scrollbar {display: none;width: 0 !important;height: 0 !important;-webkit-appearance: no…

Charles代理https接口到本地

一、操作手册 1、安装工具 1.1、安装代理软件Charles 软件下载地址&#xff1a;Download a Free Trial of Charles • Charles Web Debugging Proxy 1.2、安装https代理插件&#xff1a;&#xff08;有问题自行百度解决&#xff09; 2、配置策略 以下以https接口为例&…

mysql索引B+树可视化演示地址

https://www.cs.usfca.edu/~galles/visualization/BPlusTree.html

RISE - Ultimate Project Manager CRM 3.6.1 中文版安装指南

RISE 是一个多用途项目管理系统&#xff0c;有助于任何类型的企业管理他们的工作。它可以节省您管理客户、项目、销售和团队成员的日常时间。可提高客户满意度和工作绩效。 安装系统 登录宝塔&#xff0c;添加站点 输入域名和数据库信息&#xff0c;PHP版本至少是8.1 添加完成…