分布式事务(三)—— 两阶段提交解决方案(2PC)

系列目录:

  • 《分布式事务(一)—— 事务的基本概念》

  • 《分布式事务(二)—— CAP和Base理论》

一、常见分布式事务解决方案

  • 两阶段提交(2PC,Two-phase Commit)
  • TCC补偿模式
  • 基于本地消息表实现最终一致性
  • 基于可靠消息最终一致方案
  • 最大努力通知

二、两阶段提交(2PC)

  两阶段提交方案在目前的分布式事务中只是一种方案,因为其比较复杂,且问题比较多,实际使用的比较少,但是我们也可以进行了解。

  2PC是一个非常典型的中心化原子提交协议:这里所说的中心化指协议中有两类节点,一个是中心化的协调节点(Coordinator)和N个参与者节点(Partcipant).

两个阶段指的是:

  • 第一阶段:投票阶段
  • 第二阶段:提交/执行阶段

  两阶段提交的设计思路就是在N个调用的节点的上面加上一个协调的节点。在发生事务操作的时候,先让协调节点给每个需要参与的节点发送投票数据,也就是先发送一个预处理,等待所有的节点返回ok以后,再让协调节点给每个节点发送执行,如果在第一个阶段有返回错误,就发送回滚。

下面举个示例说明:
  比如订单服务A需要调用支付服务B去支付,支付成功则处理购物订单为待发货状态,否则需要将订单设置为失败状态。
那么看看2PC是如何处理的

1、第一阶段:投票阶段

在这里插入图片描述
第一阶段主要有3步:

  • 1、事务询问
    协调者向所有参与者发送事务预处理请求,称为Prepare,并等待各参与者的响应。
  • 2、执行本地事务
    各个参与者节点执行本地事务操作,但在执行完成后并不会真正提交数据库本地事务,而是先向协调者报告这里能不能处理的状态
  • 3、各个参与者向协调者反馈事务询问的响应
    如果执行者成功执行了事务操作,那么久返回给协调者Yes响应,表示事务可以执行,如果没有参与者成功执行事务,那么就返回给协调者No响应,表示事务不可以执行

第一阶段执行完后,会有两种可能:1、所有都返回Yes,3、有一个或者多个返回No

2、第二阶段:提交/执行阶段(成功流程)

成功条件:所有参与者都返回Yes
在这里插入图片描述
主要分为两步:

  • 1、协调者发送给各参与者提交事务Commit请求
  • 2、各个参与者收到协调者发送的Commit请求后提交本地事务,并在完成提交之后释放整个事务执行期间占用的事物资源。

3、第二阶段:提交/执行阶段(异常流程)

异常条件:任何一个参与者向协调者反馈了No响应,或者等待超时之后,协调者尚未收到所有参与者的反馈响应。
在这里插入图片描述
异常流程也分为两步:

  • 1、协调者向所有参与者发出RollBack请求
  • 2、参与者收到RollBack请求后,回滚本地事务

4、2PC的缺点

    1. 性能问题
      无论是第一阶段的过程中,还是第二阶段,所有的参与者资源和协调者资源都是被锁住的,只有当所有节点执行完毕,事务协调者才会通知全局提交。参与者进行本地事务提交后才会释放资源,这样的过程比较漫长,对性能影响比较大。
    1. 单节点故障
      由于协调者的重要性,一旦协调者发生故障,参与者会一直阻塞下去,尤其是在第二阶段,协调者发生故障,那么所有参与者还都处于锁定事务的状态,而无法完成事务提交。
      2PC出现单点故障问题的三种情况。
    • (1) 协调者正常,参与者故障
      由于协调者无法收集到所有参与者的反馈,会陷入阻塞状态。
      解决方案:引入超时机制,如果协调者在超过指定的时间还没有收到参与者的反馈,事务就失败,向所有节点发送终止事务请求。
    • (2) 协调者故障,参与者正常
      无论处于哪个阶段,如果协调者故障,无法发送提交或者回滚请求,所有处于执行了操作但是未提交状态的参与者都会陷入阻塞状态。
      解决方案:引入协调者备份,同时协调者需要记录操作日志,当检测到协调者故障一段时间后,协调者备份取代协调者,并读取操作日志,向所有参与者询问状态。
    • (3) 协调者和参与者都故障
      如果发生在第一个阶段,所有参与者都没有真正执行commit,所以只需要重新选出协调者,新的协调者重新执行第一阶段和第二阶段就可以了。
      如果发送在第二阶段并且挂了的参与者在挂掉之前没有收到协调者的指令,这是可能协调者还没有发送指令就挂了,这种情况下,新的协调者重新执行第一阶段和第二阶段就行。
      但是如果在协调者发出了指令,有的协调者执行commit成功了,有的挂了,这个时候就会出现数据不一致,虽然可以重新执行,但是原来执行成功的数据无法回退,2PC无法解决这个问题

  从上面可以看出,2PC实现很复杂,而且会引入很多的新问题,所以实际中使用的比较少。


后记
  个人总结,欢迎转载、评论、批评指正

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

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

相关文章

springboot mybatis-plus 项目分层笔记

整体定义 config: 配置项,包含configuration注解 constants: 常量类enums: 枚举 exceptions: 全局异常处理,自定义异常,RestControllerAdvice 注解 fia3: 三大器依据执行顺序:过滤器filter、拦截器interceptor、切面aop 简称 fia…

算法设计与分析实验:快速选择与单调栈

目录 一、找到K个最接近的元素 1.1 具体思路 1.2 思路展示 1.3 代码实现 1.4 复杂度分析 1.5 运行结果 二、前K个高频元素 2.1 思路一:哈希表 2.2 思路二:快速选择 2.3 思路三:堆 三、柱形图中的最大矩形 3.1 具体思路 3.2 思路…

Mysql单行函数练习

数据表 链接:https://pan.baidu.com/s/1dPitBSxLznogqsbfwmih2Q 提取码:b0rp --来自百度网盘超级会员V5的分享 单行函数练习 单行函数(一行数据返回一个结果) #1.显示系统时间(注:日期时间) #2.查询员工工号,姓名,工资以及提高百分之20后的结果(new…

2024年Java SpringBoot 计算机软件毕业设计题目推荐

博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行交流合作✌ 主要内容:SpringBoot、Vue、SSM、HLM…

Flume搭建

压缩包版本:apache-flume-1.9.0-bin.tar 百度盘链接:https://pan.baidu.com/s/1ZhSiePUye9ax7TW5XbfWdw 提取码:ieks 1.解压 tar -zxvf /opt/software/apache-flume-1.9.0-bin.tar.gz -C /opt/module/ 2. 修改文件名 [rootbigdata1 opt]…

【stm32】hal库学习笔记-FSMC连接TFT_LCD

【stm32】hal库学习笔记-FSMC连接TFT LCD 触摸屏结构与原理 LCD模块接口原理图 LCD 接口连接在 FSMC 总线上面,图中的 T_MISO/T_MOSI/T_PEN/T_SCK/T_CS 连接在 MCU 的 PB2/PF11/PB1/PB0/PC13 上,这些信号用来实现对液晶触摸屏的控制(支持电阻…

RHCE DNS域名解析服务器

目录 1. 正向解析 1.1 安装必要软件 1.2 配置静态ip 1.3 DNS配置 1.4 测试 2. 反向解析 2.1 关闭安全软件,安装必要软件 2.2 配置静态ip 2.3 DNS配置 2.4 测试 1. 正向解析 1.1 安装必要软件 1.2 配置静态ip 服务器配置 nmcli c modify ens32 ipv4.method man…

如何使用 Mermaid、GitHub 和 VSCode 用代码创建关系图三

Mermaid 系列 如何使用 Mermaid、GitHub 和 VSCode 用代码创建关系图一如何使用 Mermaid、GitHub 和 VSCode 用代码创建关系图二 1.如何创建甘特图 Gantt 甘特图以条形图的形式用作可视化表示。它有效地展示了项目的时间表,揭示了各个项目组件完成所需的持续时间…

leetcode刷题(剑指offer) 509.斐波那契数

509.斐波那契数 斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是: F(0) 0,F(1) 1 F(n) F(n - 1) F(n - 2),其中 n…

Java玩转《啊哈算法》排序综合篇之小哼买书

是诸法空相,不生不灭,不垢不净,不增不减 非目录 缘起代码地址案例桶排序冒泡排序快速排序 缘起 各位大哥大姐,兄弟姐妹们好呀!本人最近看了下《啊哈算法》,说来惭愧,买几年了,当初看…

Office提取某一页转成图片

目录结构 前言支持的文件格式代码整理maven依赖文本文档解析转换电子表格解析转换演示文档解析转换PDF解析转换小编代码整理(完整版)特别感谢扩展前言 近期公司需求,要将office文件提取第一页内容转成图片;一番调查后整理如下: 支持的文件格式 文本文档电子表格演示文档…

协会认证!百望云荣获信创工委会年度“卓越贡献成员单位”称号

当前,新一轮科技革命和产业变革正加速重塑全球经济结构,强化企业科技创新的主体地位,推动创新链、产业链、人才链深度融合,加快科技成果产业化进程至关重要。 近日,中国电子工业标准化技术协会信息技术应用创新工作委员…

HTTP中传输协议的数据格式

HTTP 概述:超文本传输协议(Hyper Text Transfer Protocol) 传输协议:定义了客户端和服务器通信时,发送数据的格式 客户端和服务器端交互:客户端向服务器端发送请求,服务器端向客户端响应请求 HTTP特点:…

安装mysql和navicat

1 安装mysql 以下是 MySQL 的安装教程: 步骤 1:下载 MySQL 首先在官方网站上下载 MySQL 安装包。在下载页面中选择第一个安装包,然后点击“下载”按钮,下载后解压缩。 下载地址 步骤 2:配置环境变量 配置MYSQL_HOME path 中添加%MYSQL_HOME%\bin 添加 my.ini ,内容…

1月威胁态势 | 0day占比83%!两大勒索家族“均分天下”

近日,亚信安全正式发布《亚信安全2024年1月威胁态势报告》(以下简称“报告”)报告显示,1月份新增安全漏洞1511个,涉及0day漏洞占83%;监测发现当前较活跃的勒索病毒家族是Wacatac和Nemucod,病毒样…

【C++】vector的简单使用和实现

vector就是我们之前数据结构学的顺序表,这篇博客就是说一说它的简单使用和底层实现 文章目录 简单使用模拟实现 简单使用 首先,我们看看它的构造函数 我们比较常用的也就是第二种,就是第一个参数是要存的数据个数,第二个是要填…

Python实现利用仅有像素级标注的json文件生成框标注的json文件,并存放到新文件夹

import json import os # create rectangle labels based on polygon labels, and store in a new folder def create_rectangle_shapes(polygon_shapes):rectangle_shapes []for polygon_shape in polygon_shapes:# 获取多边形的坐标点points polygon_shape[points]# 找到最…

node 第二十四天 mongoDB shell 命令 高级方法 $where aggregate聚合

$where 数据库数据如下 使用where语法如下 等价于 2.aggregate 聚合 使用聚合管道执行聚合操作。该管道允许用户通过一系列基于阶段的操作来处理来自集合或其他源的数据。 过滤数据, 分组数据 (排除name为 AAA 的数据 按price进行分组 每匹配一组计数1) 下面我们用aggregate…

新一轮范式转移的焦点:边缘

在万物互联的时代里 数据的洪流 正在慢慢转向边缘 👇👇👇 当成千上万的设备接入互联网,大量数据正在边缘产生。在新一轮范式转移的过程中,边缘成为创建和处理数据的关键枢纽。企业该如何有效地管理边缘数据&#x…

Qt QWidget Loading界面并覆盖在其他控件上面

目录 一、效果图二、Loading三、使用 一、效果图 界面中有一个Label&#xff0c;一个Button 点击Buttion&#xff0c;显示Loading的界面&#xff0c;并覆盖到Label和Button上面 二、Loading loadingwidget.h #ifndef LOADINGWIDGET_H #define LOADINGWIDGET_H#include <…