分布式事务2PC二阶段提交详解

文章目录

    • 概述和概念
    • 执行过程和工作流程
    • 特点
    • 优劣势
    • 应用场景
    • 总结
    • demo代码样例

概述和概念

二阶段提交(2PC)是一种用于确保在分布式系统中的所有节点在进行事务提交时保持一致性的算法
二阶段提交(Two-Phase Commit,2PC)是一种经典的分布式事务协议,用于保证分布式系统中多个节点之间的事务操作的一致性。它主要分为两个阶段:准备阶段和提交阶段。
2PC,即两阶段提交,它将分布式事务提交拆分为 2 个阶段:prepare和commit/rollback,即准备阶段和提交执行阶段。在 prepare 准备阶段需要等待所有参与子事务反馈,因此可能造成数据库资源锁定时间过长,不适合并发高以及子事务生命周长较长的业务场景。并且协调者宕机,所有参与者都收不到提交或回滚指令。
二阶段提交将整个事务处理过程分为两个阶段,即准备阶段和提交阶段。在这个过程中,有一个协调者来统一掌控所有参与者的操作结果,并指示它们是否要将操作结果进行真正的提交或者回滚。

执行过程和工作流程

下面详细解释二阶段提交的过程:
○ 投票阶段(或准备阶段):在这个阶段,每个参与者将自己的操作结果通知给协调者。如果某个参与者无法完成其任务(例如,由于某种故障),它会通知协调者。
○ 提交阶段:协调者收集所有参与者的反馈。如果所有参与者都成功完成了它们的任务,协调者会指示它们进行提交。如果有任何参与者失败,协调者会指示它们回滚,即撤销先前的操作。

  1. 准备阶段(Prepare Phase):
    ○ 协调者(Coordinator)向所有参与者(Participants)发送事务准备请求,并等待参与者的响应。
    ○ 参与者接收到事务准备请求后,执行本地事务,并将undo和redo信息记录在日志中。然后将准备就绪的消息(Vote)发送给协调者,表示是否可以提交事务。
    ○ 协调者收到所有参与者的准备就绪消息后,进入下一个阶段。
  2. 提交阶段(Commit Phase):
    ○ 协调者向所有参与者发送事务提交请求。
    ○ 参与者接收到事务提交请求后,根据之前记录的undo和redo信息,执行相应的操作。
    ○ 参与者完成事务操作后,向协调者发送完成消息(Ack)。
    ○ 协调者收到所有参与者的完成消息后,决定是否提交或回滚事务。
    ■ 如果所有参与者都发送了完成消息,则协调者发送全局提交消息给所有参与者,表示提交事务。
    ■ 如果任何一个参与者发送了失败消息或超时未发送完成消息,则协调者发送全局回滚消息给所有参与者,表示回滚事务。

在这里插入图片描述

特点

二阶段提交协议的特点和问题:
● 2PC保证了分布式系统中事务的一致性,即所有节点要么都提交事务,要么都回滚事务。
● 2PC协议的缺点是阻塞问题。在准备阶段,如果协调者发生故障或网络异常,参与者会一直等待,无法完成事务。
● 2PC对于单点故障不具备容错性,如果协调者发生故障,整个事务可能无法继续进行。
● 2PC协议在提交阶段需要所有参与者的响应,因此网络延迟或故障可能导致长时间的等待。
尽管存在一些限制,二阶段提交仍然是实现分布式事务一致性的常用协议之一。后续针对2PC的改进协议也被提出,如三阶段提交(3PC)和基于消息队列的事务消息等。这些改进协议旨在解决2PC的缺点,提高系统的可靠性和性能。

优劣势

优势:二阶段提交的优点在于它为分布式系统提供了一种简单的方式来确保事务的一致性。通过将事务的决策权集中在一个协调者上,可以避免多个节点之间复杂的协商和同步。

缺陷:然而,二阶段提交也有其局限性。最显著的问题是,如果在准备阶段有节点发生故障,协调者可能会长时间等待,甚至可能导致整个系统停滞。此外,如果在提交阶段发生故障,已经完成的操作可能无法被确认,导致资源被不必要地锁定或浪费。
总之:2pc效率很低,对高并发很不友好

应用场景

尽管存在这些缺陷,二阶段提交在某些场景中仍然是有用的。例如,它可以用于那些对一致性要求非常高的系统,如金融系统。在这些场景中,虽然系统的可用性可能会受到影响,但数据的一致性和完整性是至关重要的。

总结

总的来说,二阶段提交是一种用于确保分布式系统中事务一致性的算法。它通过将决策权集中在一个协调者上来简化问题,但也带来了如性能瓶颈和资源浪费等新的问题。在实施这种算法时,需要权衡其优缺点,并确保它适合特定应用的需求。

demo代码样例

以下是一个简单的 Java 代码示例,演示了二阶段提交(2PC)协议的基本逻辑。在实际的生产环境中,需要考虑更多的异常情况处理、事务资源管理、并发控制等方面的细节。
// 协调者代码

public class Coordinator {
    private List<Participant> participants;

    public Coordinator(List<Participant> participants) {
        this.participants = participants;
    }

    public void startTransaction() {
        // 第一阶段:准备阶段
        sendPrepareRequestToAllParticipants();
        if (receivePrepareResponsesFromAllParticipants()) {
            // 所有参与者都已经准备就绪
            sendCommitRequestToAllParticipants();
            receiveCommitResponsesFromAllParticipants();
            // 处理事务提交结果
            handleCommitResults();
        } else {
            // 任一参与者未准备就绪,回滚事务
            sendRollbackRequestToAllParticipants();
            receiveRollbackResponsesFromAllParticipants();
            // 处理事务回滚结果
        }
    }

    // 其他方法和实现细节省略
}
javaCopy Code// 参与者代码
public class Participant {
    public boolean prepare() {
        // 执行本地事务,并返回准备就绪消息
        // 记录undo和redo信息到日志
        return true;  // 或者 false,表示是否可以提交事务
    }

    public void commit() {
        // 根据之前记录的undo和redo信息执行事务提交操作
    }

    public void rollback() {
        // 根据之前记录的undo和redo信息执行事务回滚操作
    }

    // 其他方法和实现细节省略
}

在这个示例中,协调者负责协调整个分布式事务的执行过程,包括准备阶段和提交阶段的处理。参与者则负责执行本地事务,并响应协调者的请求。请注意,这只是一个简化的示例,并不涵盖所有可能的情况和错误处理。在实际的系统设计中,需要根据具体情况进行更加完善的设计和实现。

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

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

相关文章

身为Java“搬砖”程序员,你掌握了多线程吗?

摘要&#xff1a;互联网的每一个角落&#xff0c;无论是大型电商平台的秒杀活动&#xff0c;社交平台的实时消息推送&#xff0c;还是在线视频平台的流量洪峰&#xff0c;背后都离不开多线程技术的支持。在数字化转型的过程中&#xff0c;高并发、高性能是衡量系统性能的核心指…

做到这两条,破解35岁中年危机

最近我在看吴军老师的《富足》这本书&#xff0c;其中有一篇文章讲的是如何破解35岁中年危机&#xff0c;我觉得讲清楚了这个问题的本质&#xff0c;我在这里分享给你&#xff0c;以下内容大部分摘抄自《破解35岁中年危机》一章。 35岁中年危机的原因 35岁中年危机的说法好像…

Navicat for mysql备份与恢复

文章目录 一、Navicat for mysql备份1.打开navicat&#xff0c;找到备份2.点击新建备份&#xff0c;直接点备份3.备份完成 二、恢复数据1.删除表2.点击备份&#xff0c;选中备份文件&#xff0c;点击还原备份3.还原完成 三、其他命令四、视频演示总结 一、Navicat for mysql备份…

ZLMediaKit中的RingBuffer

前面的文章讲到ZLMediaKit转流&#xff0c;提到过RingBuffer&#xff0c;它是比较核心的数据结构。这篇文章就来讲讲RingBuffer的用法。 RingBuffer的类体系 RingBuffer是由多个类组成&#xff0c;分为两大功能&#xff1a;存储和数据分发。 存储功能由类RingStorage实现&…

图形图像处理车牌识别系统设计matlab

wx供重浩&#xff1a;创享日记 对话框发送&#xff1a;车牌识别 获取完整源码源文件论文报告 一、 摘要: 随这图形图像技术的发展&#xff0c;现在的车牌识别技术准确率越来越高&#xff0c;识别速度越来越快。无论何种形式的车牌识别系统&#xff0c;它们都是由触发、图像采…

【JavaWeb学习笔记】15 - jQuery

项目代码 https://github.com/yinhai1114/JavaWeb_LearningCode/tree/main/jquery 目录 零、官方文档 一、jQuery基本介绍 1.基本介绍 2.原理图 二、JQuery入门使用 1.下载JQuery 2.jQuery快速入门 三、jQuery对象 1.什么是jQuery对象? 2.DOM对象转换成jQuery对象 …

电子电器架构(E/E)演化 —— 主流主机厂域集中架构概述

电子电器架构(E/E)演化 —— 主流主机厂域集中架构概述 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。…

2008-2021年商业银行数据(农商行、城商行、国有行、股份制银行)

2008-2021年商业银行数据&#xff08;农商行、城商行、国有行、股份制银行&#xff09; 1、时间&#xff1a;2008-2021年 2、范围&#xff1a;1700银行 3 、指标&#xff1a;证券简称、year、证券代码、资产总计、负债合计、所有者权益合计、利润总额、净利润、贷款总额、存…

【六大排序详解】中篇 :选择排序 与 堆排序

选择排序 与 堆排序 选择排序 选择排序 与 堆排序1 选择排序1.1 选择排序原理1.2 排序步骤1.3 代码实现 2 堆排序2.1 堆排序原理2.1.1 大堆与小堆2.1.2 向上调整算法2.1.3 向下调整算法 2.2 排序步骤2.3 代码实现 3 时间复杂度分析 Thanks♪(&#xff65;ω&#xff65;)&#…

你真的理解了阻塞和非阻塞、同步和异步吗?

阻塞和非阻塞是一种状态&#xff0c;关键要看调用线程有没有被挂起。以处理I/O为例&#xff0c;如果是调用线程处理阻塞型I/O&#xff0c;那么调用线程会被挂起&#xff0c;此时调用线程就是阻塞的&#xff1b;如果调用线程处理的是非阻塞I/O&#xff0c;调用线程开启了I/O之后…

【Spring】15 MessageSourceAware 接口

文章目录 1. 简介2. 功能3. 使用3.1 创建并实现接口3.2 配置 Bean 信息3.3 资源文件3.4 创建启动类3.5 启动 4. 应用场景总结 Spring 框架为开发者提供了丰富的扩展点&#xff0c;其中之一是 Bean 生命周期中的回调接口。本文将专注介绍一个与国际化相关的接口 MessageSourceAw…

运筹视角下,体系化学习机器学习算法原理的实践和总结

文章目录 引言目标设计目标实践文章汇总经验总结一则预告 引言 上两周总结了我在体系化学习运筹学基础知识方面的个人经验&#xff0c;看过那篇文章的人可能知道&#xff0c;今年我还花了很多时间学习机器学习中各种模型的算法原理。 在工业应用中&#xff0c;机器学习和运筹…

Spark中使用scala完成数据抽取任务 -- 总结

如题 任务二&#xff1a;离线数据处理&#xff0c;校赛题目需要使用spark框架将mysql数据库中ds_db01数据库的user_info表的内容抽取到Hive库的user_info表中&#xff0c;并且添加一个字段设置字段的格式 第二个任务和第一个的内容几乎一样。 在该任务中主要需要完成以下几个阶…

【python】python课设 天气预测数据分析及可视化(完整源码)

目录 1. 前言2. 项目结构3. 详细介绍3.1 main.py3.2 GetModel.py3.3 GetData.py3.4 ProcessData.py3.5天气网.html 4. 成果展示 1. 前言 本文介绍了天气预测数据分析及可视化的实现过程使用joblib导入模型和自定义模块GetModel获取模型&#xff0c;输出模型的MAE。使用pyechart…

鸿蒙应用开发 自定义下拉刷新动画

1 概述 属性动画&#xff0c;是最为基础的动画&#xff0c;其功能强大、使用场景多&#xff0c;应用范围较广。常用于如下场景中&#xff1a; 一、页面布局发生变化。例如添加、删除部分组件元素。二、页面元素的可见性和位置发生变化。例如显示或者隐藏部分元素&#xff0c;…

基于 Webpack 插件体系的 Mock 服务

背景 在软件研发流程中&#xff0c;对于前后端分离的架构体系而言&#xff0c;为了能够更快速、高效的实现功能的开发&#xff0c;研发团队通常来说会在产品原型阶段对前后端联调的数据接口进行结构设计及约定&#xff0c;进而可以分别同步进行对应功能的实现&#xff0c;提升研…

LINUX系统安装和管理

目录 一.应用程序 对比应用程序与系统命令的关系 典型应用程序的目录结构 常见的软件包装类型 二.RPM软件包管理 1.RPM是什么&#xff1f; 2.RPM命令的格式 查看已安装的软件包格式 查看未安装的软件包 3.RPM安装包从哪里来&#xff1f; 4.挂载的定义 挂载命令moun…

C语言蛇形矩阵

文章目录 每日一言题目解题思路全部代码结语 每日一言 山有榛&#xff0c;隰有苓。云谁之思&#xff1f;西方美人。 --邶风简兮 题目 解题思路 话不多说&#xff0c;直接看图 通过观察图表&#xff0c;我想到了这种方法&#xff1a; 我将数字放置的位置分为两大类&#xff…

Python深度学习028:神经网络模型太多,傻傻分不清?

文章目录 深度学习网络模型常见CNN网络深度学习网络模型 在深度学习领域,有许多常见的网络模型,每种模型都有其特定的应用和优势。以下是一些广泛使用的深度学习模型: 卷积神经网络(CNN): 应用:主要用于图像处理,如图像分类、物体检测。 特点:利用卷积层来提取图像特…

【UML】第12篇 序列图(1/2)——基本概念和构成

目录 一、什么是序列图&#xff08;Sequence Diagram&#xff09; 1.1 定义 1.2 主要用途 1.3 序列图和BPMN的区别和联系 二、序列图的构成 2.1 对象 2.2 生命线 2.3 消息 2.4 激活 序列图&#xff0c;是我个人认为的用处最多的一种图。产品和研发的同学&#xff0c;都…