当前位置: 首页 > news >正文

分布式事务详解

摘要

分布式事务主要包括2pc、3pc、消息事务。

  • 2pc指两阶段提交:
    • 第一阶段是准备阶段:所有事务参与者检查执行能力并锁定对应资源,准备完成后将状态告知协调者。
    • 第二集段是提交状态:事务参与者全部准备好后,协调者发起提交请求,通知参与者提交事物。若存在参与者准备失败,则回滚。
  •   2pc的具体实现有AT、XA、TCC、Sata。
    
  • 3pc指事物分为3个阶段:
    • 第一阶段为尝试阶段:所有参与者检查自己是否有执行事物的能力,并将状态告知给协调者。
    • 第二阶段为准备阶段:协调者确认所有参与者均有执行事物的能力后,再发起请求,锁定资源;
    • 第三阶段为提交阶段:所有参与者锁定成功后,协调者发起提交请求,提交事物。
  •   3pc解决了2pc一阶段资源无效锁定的问题。
    
  • 消息事务是使用消息队列作为中间件实现的分布式事务。也分为两个阶段:
    • 第一阶段为半事务消息阶段:此时发起方发送半事务消息给消息队列。
    • 第二阶段为确认阶段:发起方执行本地事务完成后,确认半事务消息,此时下游消费者就可消费事物消息,并执行对应的事务了。
  •   消息事务是最终一致性方案。总之,分布式事务没有最好的方案,需要根据场景选择最合适的方案。
    

一、2PC(两阶段提交)

成员类型包括事务参与者和事务协调者,分为准备-提交/撤销两个阶段。

  1. 准备阶段:参与者锁定事务所需要执行的资源,并将成功或者失败状态返回给事务协调器;
  2. 提交/撤销阶段:事务协调器收到全部参与者的响应后,发起事务提交命令,然后,所有参会者提交事务;若存在参与者准备阶段失败,则发起撤销命令,所有参与者回滚。

缺点:

  1. 事务存在同步阻塞的问题;因为事务协调器需要等待全部参与者均返回响应后,才执行提交/回滚操作;
  2. 第一阶段锁定资源,可能会造成资源浪费;因为有些事务在大部分参与者上能执行,但在某个参与者上无法执行,会导致大部分参与者锁定资源,导致浪费。

1.1、XA

2PC的具体实现,利用数据库实现事务的提交和回滚。

  1. 准备阶段:参与者执行事务,但不提交;
  2. 提交/撤销阶段:协调者根据参与者执行状态,决定提交或者回滚。

缺点:拥有2PC的全部缺点。

1.2、AT

2PC的具体实现,准备阶段直接会提交事务,利用日志记录待操作的原始数据记录的镜像,利用镜像去执行撤销操作,相较于XA同步阻塞的时间更短了。

  1. 准备阶段:获取操作数据的全局锁,然后,参与者直接执行事务并提交,并将原数据记录已经执行后的结果存入日志;
  2. 确认/撤销阶段:如果存在参与者执行失败,就利用日志撤销其它参与者的执行结果。

1.3、TCC

2PC的具体实现,由业务代码实现资源锁定和事务的提交、回滚操作,分为Try-Confirm/Cancel。

  1. Try阶段:确认参与者执行能力,锁定资源;
  2. Confirm/Cancel阶段:当所有参与者第一阶段try成功,则执行confirm提交事务;若存在参与者try失败,就执行cancel回滚。

缺点:

  1. 在第二阶段会存在部分参与者confirm/cancel失败的情况,需要参与机制确保其至少执行一次。例如使用轮询加幂等性的方法。
  2. 空回滚问题:例如在第一阶段try时,由于网络问题参与者a未收到try请求,协调器会发生cancel命令,此时参与者a在未收到try时,就已经收到cancel了,造成空回滚。

1.4、saga

2pc具体实现,长事务的解决方案,和AT有点像,区别在于saga是通过执行补偿业务去完成回滚。

  1. 一阶段:执行事务并直接提交;
  2. 二阶段:当存在参与者执行失败,就通过对应的补偿业务,回滚所有执行过了的操作。

缺点:

  1. 存在脏写;
  2. 事务完成执行的时间不确定。

二、3PC(三阶段提交)

成员类型包括事务参与者和事务协调者,分为询问-准备-提交/撤销三个阶段;解决了2PC资源浪费的问题。

  1. 询问阶段(canCommit):不锁定资源,只检查参与者是否有执行事务的能力;
  2. 准备阶段:确认全部参与者均拥有事务执行能力,就锁定资源;
  3. 提交/撤销阶段:确认参与者全部就绪,就提交事务;若其中存在未就绪的,就回滚。

还是存在事务同步阻塞的问题。

三、消息队列式分布式事务

用消息队列去实现分布式事务。

  1. 一阶段:生产者发送半事务消息给消息队列;
  2. 二阶段:生产者执行本地事务,执行成功则发送半事务消息的”确认“,以使得半事务消息变为终态,下游消费者能够更加事务消息去执行对应的事务;若执行失败,则取消半事务消息。

缺点:

  1. 下游消费者的事务若无法执行,没办法回滚上游生产者的事务,从而导致数据状态不一致;

相关文章:

分布式事务详解

摘要 分布式事务主要包括2pc、3pc、消息事务。 2pc指两阶段提交: 第一阶段是准备阶段:所有事务参与者检查执行能力并锁定对应资源,准备完成后将状态告知协调者。第二集段是提交状态:事务参与者全部准备好后,协调者发…...

车载通信架构 —— DDS协议介绍

车载通信架构 —— DDS协议介绍 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和…...

nginx根据不同的客户端设备进行转发请求——筑梦之路

这里主要介绍七层负载方式实现。 环境说明: pc端 web-1 苹果ios端 web-2 安卓Android端 web-3 负载均衡 web-lb 配置示例: pc端: server {listen 9000; #监听9000server_name pc.xxx.com;charset utf-8;location / {root /…...

增强LLM:使用搜索引擎缓解大模型幻觉问题

论文题目:FRESHLLMS:REFRESHING LARGE LANGUAGE MODELS WITH SEARCH ENGINE AUGMENTATION 论文地址:https://arxiv.org/pdf/2310.03214.pdf 论文由Google、University of Massachusetts Amherst、OpenAI联合发布。 大部分大语言模型只会训练一次&#…...

WPF向Avalonia迁移(一、一些通用迁移项目)

通用变更 WPF&#xff1a;Visibility 其他参考文档 WPF&#xff1a; <TextBlock Visibility"Visible"/><TextBlock Visibility"Collapsed"/><TextBlock Visibility"Hidden"/>Avalonia &#xff1a; <TextBlock IsVisib…...

lua学习笔记

单行注释&#xff1a; 多行注释&#xff1a; 命名&#xff1a; Lua不支持下划线大写字母&#xff0c;比如&#xff1a;_ABC 但支持&#xff1a;_abc 关键字&#xff1a; 全局变量&#xff1a; 直接变量名 内容就是全局 局部变量&#xff1a; 加上local即可 nil&#xff1…...

修改 ModelScope 默认缓存路径

修改 ModelScope 默认缓存路径 设置 MODELSCOPE_CACHE 和 MODELSCOPE_MODULES_CACHE 两个环境变量。 export MODELSCOPE_CACHE<your_favourite_path>/hub export MODELSCOPE_MODULES_CACHE<your_favourite_path>/modelscope_modules完结&#xff01;...

【ES实战】索引别名的使用说明

索引别名 文章目录 索引别名带有过滤器的别名RoutingWrite Index REST单一添加一个别名示例: 索引创建是增加别名删除别名检索现有别名示例: 索引别名可以通过API的方式进行操作一个索引别名可以映射到一个或一个以上的索引索引名和索引别名不能重复&#xff0c;在集群中都是唯…...

QT信号与槽机制 和 常用控件介绍

QT信号与槽机制 1、信号(signal): 所谓信号槽 (观察者模式)信号本质是事件。信号展现方式就是函数。当某一个事件发生之后&#xff0c;则发出一个信号(signal). 2、槽(slot): 就是对信号响应的函数&#xff0c;槽就是一个函数。槽函数与普通函数区别槽函数可以与一个信号关联&…...

【css-banner图片自适应】

<picture><source media"(max-width: 480px)" srcset"图片地址"><source media"(min-width: 481px)" srcset"图片地址"><img src"图片地址" id"homebanner"></picture>img{height:…...

【k8s管理操作】

k8s管理操作 一、k8s管理操作1.陈述式资源管理2.声明式资源管理 二、k8s基础信息常看&#xff08;命令&#xff09;增删改查项目的生命周期&#xff1a;创建-->发布-->更新-->回滚-->删除 headless clusterIP 无头模式 金丝雀发布&#xff08;Canary Release&#…...

【java基础学习】之DOS命令

#java基础学习 1.常用的DOS命令&#xff1a; dir:列出当前目录下的文件以及文件夹 md: 创建目录 rd:删除目录cd:进入指定目录 cd.. :退回到上级目录 cd\ : 退回到根目录 del:删除文件 exit:退出dos命令行 1.dir:列出当前目录下的文件以及文件夹 2.md: 创建目录 …...

学习记录——StyleGAN2+SA-UNet

SA-UNet for Retinal Vessel improvment using StyleGAN2 作者提出了一种改进视网膜图像分割的方法,通过创建图像及其相应的分割地图来实现。作者的解决方案包括使用DRIVE数据集1对StylGAN2进行训练,并使用目前在分割DRIVE图像方面取得最先进结果的SA-UNet模型对新合成的图像…...

JVM222

文章目录 JVM222运行时数据区的内部结构线程程序计数器&#xff08;PC寄存器&#xff09;虚拟机栈 JVM222 运行时数据区的内部结构 概述 本节主要讲的是运行时数据区&#xff0c;也就是下图这部分&#xff0c;它是在类加载器加载完成后的阶段&#xff0c;如下图&#xff1a; …...

C语言 指针

含义 从根本上看&#xff0c;指针是一个值为内存地址的变量&#xff08;或数据对象&#xff09;。指针变量的值是地址。 要创建指针变量&#xff0c;先要声明指针变量的类型 作用 1.实现复杂的数据结构&#xff0c;例如数组、链表、队列和堆栈等&#xff1b; 2.能方便地表…...

YOLOv8血细胞检测(7):小目标大目标一网打尽,轻骨干重Neck的轻量级GFPN | 阿里ICLR2022 GiraffeDet

💡💡💡本文改进:小目标大目标一网打尽GFPN,提升大小目标检测性能 GFPN | 亲测在血细胞检测项目中涨点,map@0.5 从原始0.895提升至0.904 收录专栏: 💡💡💡YOLO医学影像检测:http://t.csdnimg.cn/N4zBP ✨✨✨实战医学影像检测项目,通过创新点验证涨点可…...

广度优先(BFS)(例子:迷宫)

广度优先搜索算法&#xff08;BFS&#xff09;是一种用于图形和树数据结构的搜索算法。该算法从根节点开始搜索&#xff0c;然后依次访问每个相邻节点。在搜索过程中&#xff0c;每个节点都标记为已访问&#xff0c;以避免重复访问。BFS算法适用于寻找最短路径的问题&#xff0…...

【安卓源码】安卓Watchdog 机制

在Android系统中&#xff0c;也设计了一个软件层面Watchdog&#xff0c;用于保护一些重要的系统服务&#xff0c;比如&#xff1a;AMS、WMS、PMS等&#xff0c;由于以上核心服务运行在system_server进程里面&#xff0c;所以当以上服务出现异常时&#xff0c;通常会将system_se…...

inscode连接不上gpu,持续8小时,为了数据不丢失续费了6小时,我只想知道什么时候可以连接

并且给我相应的补偿...

QT位置相关函数

Qt&#xff08;Qt Framework&#xff09;是一个流行的C应用程序开发框架&#xff0c;提供了丰富的位置相关函数和类&#xff0c;用于处理窗口、窗口小部件和图形的位置和几何操作。以下是一些常用的Qt位置相关函数和类&#xff1a; QPoint&#xff1a;QPoint类表示一个二维点的…...

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:

一、属性动画概述NETX 作用&#xff1a;实现组件通用属性的渐变过渡效果&#xff0c;提升用户体验。支持属性&#xff1a;width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项&#xff1a; 布局类属性&#xff08;如宽高&#xff09;变化时&#…...

【Java学习笔记】Arrays类

Arrays 类 1. 导入包&#xff1a;import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序&#xff08;自然排序和定制排序&#xff09;Arrays.binarySearch()通过二分搜索法进行查找&#xff08;前提&#xff1a;数组是…...

【解密LSTM、GRU如何解决传统RNN梯度消失问题】

解密LSTM与GRU&#xff1a;如何让RNN变得更聪明&#xff1f; 在深度学习的世界里&#xff0c;循环神经网络&#xff08;RNN&#xff09;以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而&#xff0c;传统RNN存在的一个严重问题——梯度消失&#…...

OkHttp 中实现断点续传 demo

在 OkHttp 中实现断点续传主要通过以下步骤完成&#xff0c;核心是利用 HTTP 协议的 Range 请求头指定下载范围&#xff1a; 实现原理 Range 请求头&#xff1a;向服务器请求文件的特定字节范围&#xff08;如 Range: bytes1024-&#xff09; 本地文件记录&#xff1a;保存已…...

ETLCloud可能遇到的问题有哪些?常见坑位解析

数据集成平台ETLCloud&#xff0c;主要用于支持数据的抽取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;和加载&#xff08;Load&#xff09;过程。提供了一个简洁直观的界面&#xff0c;以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

【单片机期末】单片机系统设计

主要内容&#xff1a;系统状态机&#xff0c;系统时基&#xff0c;系统需求分析&#xff0c;系统构建&#xff0c;系统状态流图 一、题目要求 二、绘制系统状态流图 题目&#xff1a;根据上述描述绘制系统状态流图&#xff0c;注明状态转移条件及方向。 三、利用定时器产生时…...

【Java_EE】Spring MVC

目录 Spring Web MVC ​编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 ​编辑参数重命名 RequestParam ​编辑​编辑传递集合 RequestParam 传递JSON数据 ​编辑RequestBody ​…...

自然语言处理——Transformer

自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效&#xff0c;它能挖掘数据中的时序信息以及语义信息&#xff0c;但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN&#xff0c;但是…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)

上一章用到了V2 的概念&#xff0c;其实 Fiori当中还有 V4&#xff0c;咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务)&#xff0c;代理中间件&#xff08;ui5-middleware-simpleproxy&#xff09;-CSDN博客…...