分布式事务-两阶段提交2PC
2PC协议就是两阶段提交,用来解决分布式事务,分为两个阶段,分别为Prepare和Commit,也是PC由来。
第一阶段Prepare 提交事务请求

如图所示,主要流程有以下三个方面
-
询问:事务协调者(Manager)向所有的事务参与者发送事务请求,询问是否可能执行事务,然后等待各个待各个事务参与者的响应。
-
执行:各个事务参与者在接收到事务协调者的请求后,开始执行事务操作,并将undo、redo信息记录到事务日志中去。
-
响应:如果参与者成功执行了事务并记录了undo、redo日志,则向事务协调者返回YES,否则返回NO,当然了在实际中也可能存在参与者宕机就一直得不到响应的情况。
第二阶段Commit 执行事务提交
两种情况,一种是成功执行commit,另一种是执行失败rollback
执行成功commit,流程图

-
commit请求:事务协调者向所有的事务参与者发送事务commit请求。所有的事务参与者在接收到协调者的请求后,执行事务提交操作,执行完成后释放在事务执行期间占用的系统资源。
-
反馈结果:参与者执行完事务提交后向协调者发送Ack响应。
-
完成事务:协调者在接收到所有事务参与者的Ack响应后完成事务提交。
执行失败rollback
在执行Prepare阶段,难免的可能会出现如下情况:
-
参与者执行事务失败
-
参与者服务宕机
-
协调者与参与者网络通信中断
如果出行以上情况,这时协调者就无法接收到参与者的YES响应或者某一个参与者返回了NO响应,这时协调者就进入到了事务rollback回滚阶段,对事务进行回滚操作。如下图

-
rollback请求:事务协调者向所有的事务参与者发送事务rollback回滚请求。
-
参与者在接收到协调者的rollback回滚操作后,会根据在Prepare阶段记录的undo日志进行事务回滚,完成事务回滚后会释放掉在事务回滚执行期间占用的所有资源。
-
结果反馈:参与者完成事务rollback回滚后会向协调者发送Ack响应。
-
完成事务:事务协调者在接收到所有事务参与者的Ack响应后完成事务rollback回滚。
可能存在的问题
-
同步阻塞:在参与者等待协调者的指令的时候,实质上是在等待参与者的响应,在这期间参与者就不能进行任何其他的操作,也就是阻塞了其运行。如果发生了协调者与参与者不能进行网络通信的情况,参与者一直接收不到协调者的指令,那么参与者将会一直阻塞下去。
-
单点:在2PC中,一切请求都来自协调者,所以协调者的地位是至关重要的,如果协调者宕机,那么就会使参与者一直阻塞并一直占用资源。如果协调者也是分布式,使用选主方式提供服务,那么在一个协调者挂掉后,可以选取另一个协调者继续后续的服务,可以解决单点问题。但是,新协调者无法知道上一个事务的全部状态信息(例如已等待Prepare响应的时长等),所以也无法顺利处理上一个事务。
-
数据不一致:Commit事务过程中,Commit/Rallback请求可能因为协调者宕机或协调者与参与者网络问题丢失,那么就导致了部分参与者没有收到Commit/Rallback请求,而其他参与者则正常收到执行了Commit/Rallback操作,没有收到请求的参与者继续阻塞。这时参与者之间的数据就不再一致了。
-
环境可靠性依赖:协调者Prepare请求发出后,等待响应,然而如果有参与者宕机或与协调者之间的网络中断,都会导致协调者无法收到所有参与者的响应,那么在2PC中,协调者会等待一定时间,然后超时后,会触发事务回滚。在这个过程中,协调者和所有参与者都是出于阻塞的。这种机制对网络问题常见的现实环境来说太苛刻了。
相关文章:
分布式事务-两阶段提交2PC
2PC协议就是两阶段提交,用来解决分布式事务,分为两个阶段,分别为Prepare和Commit,也是PC由来。 第一阶段Prepare 提交事务请求 如图所示,主要流程有以下三个方面 询问:事务协调者(Manager)向所有的事务参与…...
初识Spring (Spring 核心与设计思想)
文章目录 什么是 Spring什么是容器什么是 IoC理解 Spring IoCDI 概念 什么是 Spring Spring 官网 官方是这样说的: Spring 让每个人都能更快、更轻松、更安全地进行 Java 编程。春天的 专注于速度、简单性和生产力使其成为全球最受欢迎Java 框架。 我们通常所说的 Spring 指的…...
智能优化算法应用:基于教与学算法无线传感器网络(WSN)覆盖优化 - 附代码
智能优化算法应用:基于教与学算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于教与学算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.教与学算法4.实验参数设定5.算法结果6.参考文献7.…...
Bitcoin SV 和 Bitcoin Core 之间首次跨链原子交换
我们已经执行了 Bitcoin SV 和 Bitcoin Core 之间的首次原子交换。 这一成就代表了比特币 SV 的重大进步,以去信任的方式促进了与其他区块链的无缝互操作性。 图片源自Gemini 在上一篇文章中,我们解释了原子交换的高级理论。 我们深入研究了使用哈希时间…...
RT-DETR改进 | 2023 | InnerEIoU、InnerSIoU、InnerWIoU、InnerDIoU等二十余种损失函数
论文地址:官方Inner-IoU论文地址点击即可跳转 官方代码地址:官方代码地址-官方只放出了两种结合方式CIoU、SIoU 本位改进地址: 文末提供完整代码块-包括InnerEIoU、InnerCIoU、InnerDIoU等七种结合方式和其AlphaIoU变种结合起来可以达到二十…...
JDBC编程基础
JDBC编程基础 JDBC介绍创建JDBC项目的步骤1.引入依赖2.注册驱动3.获取数据库连接4.获取sql执行对象 JDBC 常用 API 详解sql执行对象PreparedStatement作用 事务管理结果集对象 JDBC项目demo测试 JDBC介绍 每个数据库都会提供一组API来支持程序员实现自己客户端,自己…...
Linux shell命令
Linux shell命令 1、Shell简介 Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。 Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问…...
Vue 3 面试经验分享
🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…...
Vue简易的车牌输入键盘,可以根据需要修改
效果图如下: 代码如下: <template><div><div class"carNoBoxInput"><div style"padding: 6px;border: 2px solid #fff;border-radius: 6px;margin: 6px 3px 6px 6px;"><input class"inputBox"…...
十分钟搭建VScode C/C++运行环境
一、下载配置vscode 1.下载安装VScode 地址:https://code.visualstudio.com/download 下载后,运行安装程序 (VSCodeUserSetup-{version}.exe)。这只需要一分钟。安装程序会将 Visual Studio Code 添加到环境变量中%,可以使用CMD键入“code”…...
控制台gbk乱码
引用IntelliJ IDEA中 统一设置编码为utf-8或GBK-CSDN博客 特别注意file coding 的文件path和java的编码格式 配置...
Springboot日志-logback
logback-spring.xml的配置项 共有一个父标签、两种属性、三个节点: 一个父标签:configuration 两种属性:contextName和property 三个节点:appender、root、logger 日志级别 日志级别从低到高分为TRACE < DEBUG < INFO < WARN &…...
六、Lua 运算符
文章目录 一、Lua 运算符(一)算术运算符(二)关系运算符(三)逻辑运算符(四)其他运算符 二、运算符优先级 一、Lua 运算符 运算符是一个特殊的符号,用于告诉解释器执行特定…...
Android frameworks 开发总结十一
1.修改GMS的setup wizard 1.1 找到需要修改的文件 打开vendor/partner_gms/apps/GmsSampleIntegration/res/values/config.xml文件。以Arashi R为例: <resources><string name="wizard_script_uri" translatable="false">android.resource…...
学嵌入式,已经会用stm32做各种小东西了,下一步是什么
学嵌入式,已经会用stm32做各种小东西了,下一步是什么,研究stm32的内部吗? 针对题主这种类型的,首先我想提出几个技术问题。 1,除了那几个常用的外设,stm32上集成的众多外设是否都有实际的使用经…...
Java面试题10
1.MyBatis 中 #{}和 ${}的区别是什么? #{} 是预编译的占位符,MyBatis会将其转化为一个占位符参数,安全性较高,可以防止 SQL注入; ${} 是字符串替换,直接将内容替换到SQL语句中,不会进行参数处理…...
DBeaver连接MySQL提示“Public Key Retrieval is not allowed“问题解决方式
更新时间:2023年10月31日 11:37:53 作者:产品人小柒 dbeaver数据库连接工具,可以支持几乎所有的主流数据库.mysql,oracle.sqlserver,db2 等等,这篇文章主要给大家介绍了关于DBeaver连接MySQL提示"Public Key Retrieval is not allowed"问…...
振弦式轴力计和振弦采集仪组成的安全监测解决方案
振弦式轴力计和振弦采集仪组成的安全监测解决方案 振弦式轴力计和振弦采集仪是一种常用的结构安全监测工具,可以用于评估建筑物、桥梁、隧道或其他结构的结构健康状态和安全性能。这种监测方案较为先进、精确,并且能够监测长期的结构反应,因此…...
卡尔曼滤波
通过 Eigen 矩阵运算实现线性卡尔曼滤波。模拟的是一辆带火箭发动机的汽车,一开始沿着X轴匀速运动,到X轴中间开启火箭发动机匀加速向Y轴起飞。同理可以仿真(x,y,z,yaw,pitch,raw) 6自由度的真实飞行情况 #include <iostream&g…...
不受平台限制,Sketch 网页版震撼登场
Sketch 是一种基于 Mac 的矢量图形编辑器,可用于数字设计。其主要功能包括无损矢量编辑、完美像素精度和数百个插件同步功能,可导出预设和代码。它是目前流行的页面交互协作设计工具。但是 Sketch 最大的缺点是对 Windows/PC 用户不友好。严格来说&#…...
8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...
【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...
今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存
文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...
20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...
Linux 中如何提取压缩文件 ?
Linux 是一种流行的开源操作系统,它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间,使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的,要在 …...
系统掌握PyTorch:图解张量、Autograd、DataLoader、nn.Module与实战模型
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文通过代码驱动的方式,系统讲解PyTorch核心概念和实战技巧,涵盖张量操作、自动微分、数据加载、模型构建和训练全流程&#…...
人工智能 - 在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型
在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型。这些平台各有侧重,适用场景差异显著。下面我将从核心功能定位、典型应用场景、真实体验痛点、选型决策关键点进行拆解,并提供具体场景下的推荐方案。 一、核心功能定位速览 平台核心定位技术栈亮…...
第八部分:阶段项目 6:构建 React 前端应用
现在,是时候将你学到的 React 基础知识付诸实践,构建一个简单的前端应用来模拟与后端 API 的交互了。在这个阶段,你可以先使用模拟数据,或者如果你的后端 API(阶段项目 5)已经搭建好,可以直接连…...
