分布式事务 两阶段提交协议(2PC的原理、挑战)


引言:分布式事务的挑战

在分布式系统中,数据和服务往往分布在多个节点上。例如,一个电商下单操作可能涉及订单服务、库存服务和支付服务,这三个服务需要协同完成一个事务:要么全部成功,要么全部失败。这种跨服务的原子性操作需求,催生了分布式事务协议,而其中最经典的方案之一便是两阶段提交协议(2PC, Two-Phase Commit Protocol)

尽管2PC存在诸多争议(如性能问题、单点故障),但它仍然是理解分布式一致性的基石。


一、2PC的核心原理

1. 角色定义
  • 协调者(Coordinator):事务的发起者,负责决策事务的提交或回滚。
  • 参与者(Participant):事务的执行者,负责本地事务操作并响应协调者的指令。
2. 两阶段流程
阶段1:准备阶段(Prepare Phase)
  1. 协调者向所有参与者发送CanCommit?请求,并等待响应。
  2. 参与者执行本地事务操作(不提交),记录Undo(回滚)和Redo(重做)日志,锁定资源。
  3. 参与者根据执行结果回复协调者:
    • Yes:本地事务可提交。
    • No:本地事务无法提交(如资源不足、违反约束)。
阶段2:提交阶段(Commit Phase)
  1. 协调者根据参与者响应决定事务命运:
    • 所有参与者回复Yes:协调者发送Commit命令。
    • 任一参与者回复No:协调者发送Rollback命令。
  2. 参与者根据指令执行操作:
    • Commit:提交事务,释放资源锁。
    • Rollback:回滚事务,利用Undo日志恢复数据。
3. 事务日志的持久化
  • 协调者需在发送指令前将事务状态(Commit/Rollback)写入持久化日志。
  • 参与者需在Prepare阶段完成后持久化本地事务状态,确保宕机后能恢复。

二、2PC的致命缺陷

尽管2PC提供了强一致性保证,但其设计存在显著问题:

1. 同步阻塞(Blocking Problem)
  • 参与者在Prepare阶段锁定资源后,必须等待协调者的最终指令。若协调者宕机或网络分区,参与者将无限期阻塞,导致系统整体可用性下降。
  • 案例:在电商场景中,若库存服务锁定商品后因协调者故障无法提交,用户将无法购买该商品。
2. 单点故障(Single Point of Failure)
  • 协调者宕机时:
    • 若在Prepare阶段宕机,参与者因未收到指令而持续阻塞。
    • 若在Commit阶段宕机,部分参与者可能已提交,导致数据不一致。
  • 解决方案:通过协调者集群(如Paxos选主)和日志冗余,但复杂度陡增。
3. 数据不一致(Inconsistency)
  • 在极端情况下(如协调者与部分参与者同时宕机),可能出现部分提交
    • 参与者A收到Commit并提交。
    • 参与者B未收到Commit,最终回滚。
  • 此时系统处于不一致状态,需人工介入修复。
4. 性能瓶颈
  • 两轮网络通信(Prepare + Commit)增加延迟。
  • 资源锁竞争:长事务可能引发死锁或并发性能下降。

三、2PC的容错机制

1. 超时中断与自动回滚
  • 参与者超时:若参与者在Prepare阶段后未收到协调者指令,可主动回滚事务。
  • 协调者超时:若协调者在Commit阶段未收到参与者ACK,需根据日志重试或标记事务为“可疑状态”。
2. 协调者日志恢复
  • 协调者需持久化事务状态(如PreparedCommittingAborting),重启后根据日志恢复未完成的事务。
  • 日志设计:通常采用WAL(Write-Ahead Logging)技术,确保日志写入先于指令发送。
3. 人工干预与补偿
  • 对于不一致的事务,需提供工具查询事务状态,并手动触发补偿操作(如反向转账)。

四、2PC vs. 其他协议

协议一致性性能复杂度适用场景
2PC强一致性传统数据库、短事务
3PC弱强一致性减少阻塞,但实现复杂
TCC最终一致性高并发、需业务补偿
Saga最终一致性长事务、跨服务流程

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

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

相关文章

Jenkins Pipeline 构建 CI/CD 流程

文章目录 jenkins 安装jenkins 配置jenkins 快速上手在 jenkins 中创建一个新的 Pipeline 作业配置Pipeline运行 Pipeline 作业 Pipeline概述Declarative PipelineScripted Pipeline jenkins 安装 安装环境: Linux CentOS 10:Linux CentOS9安装配置Jav…

【CF】Day43——Codeforces Round 906 (Div. 2) E1

E1. Doremys Drying Plan (Easy Version) 题目: 思路: very好题,加深对扫描线的应用,值得深思 由于k 2,那我们就可以使用简单一点的方法来写 题目可以转化为:给定n个线段,现在让你删去2条线段…

电子设备的“记忆大脑”:NAND、NOR、EEPROM谁在掌控你的数据?

大家好,我是硅言。存储芯片是电子设备的“记忆大脑”,未进入存储行业工作之前,一听到NAND、NOR、EEPROM这些专业名词就头大。本文用通俗的语言,带大家了解这三种常见存储芯片的核心区别和应用场景。 一、存储芯片的“门派”&#…

可视化程序设计|| 实验三:C#面向对象编程(二)

一、实验目的 1.加深理解面向对象编程的概念,如类、对象、实例化等。 2.熟练掌握类的封装、继承和多态机制。 3.掌握编程常用的几种排序算法。 4.理解异常的产生过程和异常处理的概念,掌握C#异常处理的方法。 5.能够将面向对象思想应用与编程实践&a…

STM32MPU开发之旅:从零开始构建嵌入式Linux镜像

前言 在工业4.0与边缘计算深度融合的今天,STM32MP257F作为意法半导体第二代工业级64位微处理器的旗舰产品,凭借异构计算架构、1.35 TOPS边缘AI算力和军工级安全特性,已成为工业自动化、机器视觉和新能源控制等领域的标杆方案。 性能跃迁的异…

大模型应用开发(PAFR)

Prompt问答 特征:利用大模型推理能力完成应用的核心功能 应用场景: 文本摘要分析 舆情分析 坐席检查 AI对话 AgentFunction Calling 特征:将应用端业务能力与AI大模型推理能力结合,简化复杂业务功能开发 应用场景: 旅行指南 数据…

SpringClound 微服务分布式Nacos学习笔记

一、基本概述 在实际项目中,选择哪种架构需要根据具体的需求、团队能力和技术栈等因素综合考虑。 单体架构(Monolithic Architecture) 单体架构是一种传统的软件架构风格,将整个应用程序构建为一个单一的、不可分割的单元。在这…

WebRTC服务器Coturn服务器用户管理和安全性

1、概述 Coturn服务器对用户管理和安全方面也做了很多的措施,以下会介绍到用户方面的设置 1.1、相关术语 1.1.1 realm 在 coturn 服务器中,域(realm)是一种逻辑上的分组概念,用于对不同的用户群体、应用或者服务进行区…

基于opencv和PaddleOCR识别身份证信息

1、安装组件 pip install --upgrade paddlepaddle paddleocr 2、完整code import cv2 import numpy as np from paddleocr import PaddleOCR# 初始化 PaddleOCR use_angle_clsTrue, lang"ch", det_db_thresh0.1, det_db_box_thresh0.5)def preprocess_image(image…

【6】GD32 高级通信外设 CAN、USBD

高级通信外设:CAN、USBD CAN CAN简介、主要功能与相关API回环模式收发发送特定ID的数据帧实验CAN数据帧的接收实验使用过滤器接收特定的数据帧 USBD USB通信简介USBD设备固件库架构、分层文件与库函数说明USBD模拟键盘应用USBD虚拟串口应用USBD模拟U盘应用

【LLM+Code】Windsurf Agent 模式PromptTools详细解读

一、前言 https://windsurf.com/ https://windsurf.com/blog/why-we-built-windsurf https://github.com/x1xhlol/system-prompts-and-models-of-ai-tools/tree/main/Windsurf 二、System Prompt 相比于cursor和claude code, windsurf的system prompt非常长&am…

安全性测试常规测试点全解析:从基础到高级的实战指南

引言 安全性测试是保障软件系统免受恶意攻击的核心环节,其目标是识别系统在设计、开发、部署过程中存在的安全漏洞。本文将围绕12大常规安全测试点展开,结合具体测试方法、示例代码及防范建议,帮助读者构建完整的安全测试体系。 一、认证与授权测试 1. 认证机制测试 测试…

OpenCV 图形API(55)颜色空间转换-----将图像从 RGB 色彩空间转换为 I420 格式函数RGB2I420()

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 将图像从 RGB 色彩空间转换为 I420 色彩空间。 该函数将输入图像从 RGB 色彩空间转换为 I420。R、G 和 B 通道值的常规范围是 0 到 255。 输出图…

Pycharm(十六)面向对象进阶

一、继承 概述: 实际开发中,我们发现很多类中的步分内容是相似的,或者相同的,每次写很麻烦,针对这种情况, 我们可以把这些相似(相同的)部分抽取出来,单独地放到1个类中&…

Codeforces Round 1020 (Div. 3)(题解ABCDEF)

A. Dr. TC 有n次翻转,从1到n,0->1,1->0,每次统计1的数量,设cnt1是字符串1的数量,n次就是n*cnt1, 但每个1都会被翻转一次减去一个cnt1,再统计cnt0,每个被翻转一次,答案就是(n-1)*cnt1cnt0…

HTML字符实体和转义字符串

HTML字符实体和转义字符串用于处理特殊字符,确保它们在不同上下文中正确显示或解析。以下是详细总结: HTML字符实体(Character Entities) ‌定义‌:用于在HTML中表示保留字符或不可见字符,避免与HTML语法…

FreeRTOS菜鸟入门(六)·移植FreeRTOS到STM32

目录 1. 获取裸机工程模版 2. 下载 FreeRTOS V9.0.0 源码 3. FreeRTOS文件夹内容简介 3.1 FreeRTOS文件夹 3.1.1 Demo文件夹 3.1.2 License 文件夹 3.1.3 Source 文件夹 3.2 FreeRTOS-Plus 文件夹 4. 往裸机工程添加 FreeRTOS 源码 5. 拷贝 FreeRTOSConfig…

通过 Tailwind CSS 自定义样式 实现深色模式切换

创建vite项目或者vue-cli配置大同小异 1、当前环境 Vue.js 3.5nuxtjs/tailwindcss 6.13.1nuxt3.15.4node18 这里主要依赖是tailwindcss 因为当前项目是使用nuxt开发。 2、配置颜色模式 在assets/css下创建main.css * {padding: 0;margin: 0;box-sizing: border-box; }[dat…

PWNOS:2.0(vulnhub靶机)

文章目录 靶机地址主机发现、端口扫描web渗透目录探测漏洞利用权限提升 解密工具地址总结 靶机地址 https://download.vulnhub.com/pwnos/pWnOS_v2.0.7z 这里如果是windows系统直接使用vmware或者virtubox打开可以使用,如果是mac系统需再去做一个配置,比较麻烦 这里…

Gartner魔力象限(Gartner Magic Quadrant)

Gartner魔力象限(Gartner Magic Quadrant)是由全球领先的研究和咨询公司Gartner发布的市场研究报告,广泛应用于IT行业,尤其是在技术供应商评估中。它以图形化的方式展示了不同技术领域中各个供应商的市场表现,帮助企业…