分布式事务(三)—— 两阶段提交解决方案(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,一经查实,立即删除!

相关文章

SQL 快速参考手册

SQL 语句语法AND / ORSELECT column_name(s) FROM table_name WHERE condition AND|OR conditionALTER TABLEALTER TABLE table_name ADD column_name datatype 或者: ALTER TABLE table_name DROP COLUMN column_name AS (alias)SELECT column_name AS column_alia…

springboot mybatis-plus 项目分层笔记

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

考研经验总结——政治篇

文章目录 一、前言二、学习情况三、最后 一、前言 不要提前,不要提前,不要提前, 我曾在暑假的时候上了7天左右的政治课,讲真话是很有趣的,并且对于自身的世界观、人生观和价值观的改善也是相当不错的,把我…

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

目录 一、找到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…

Unity中常见的单词

前言 unity中常见的单词学习积累 一.常用的基础词。 new:新建; as:像。。一样; null:对象空值; void:函数返回空值; switch:开关; abstract:抽象的; event:事件; return:返回; class:类; …

如何使用 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文件提取第一页内容转成图片;一番调查后整理如下: 支持的文件格式 文本文档电子表格演示文档…

Java 数据结构篇 二叉树与红黑树详细讲解通俗易懂

二叉树(Binary Tree) 二叉树(Binary Tree) 二叉树是一种特殊的树形数据结构,其中每个节点最多有两个子节点,分别称为左子节点和右子节点。二叉树可以是空的,也可以是由根节点以及左右两个子树…

python 读图片封装

python 读图片封装 支持 视频,图片文件夹,图片 2024.02.01更新 安装依赖项:pip install natsort #-*-coding:utf-8-*- import os.path from natsort import natsorted import cv2class ImgReader:def __init__(self, source, typemp4):if …

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

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

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,病毒样…