分布式理论之分布式事务

news2025/1/21 18:42:53

写在前面

我们知道,像MySQL的InnoDB存储引擎提供了事务的能力,严格遵守AICD的事务要求,但是在分布式环境中,一个请求会在多个服务实例存在多个事务,如购物,会有订单系统,支付系统,物流系统,各个系统的事务逻辑上是一个统一的整体,也要保证事务,这种状态下的事务我们就叫做分布式事务,本文要一起学习的就是有哪些方案可以来解决分布式事务的问题。

1:都有哪些方法解决分布式事务

在分析都有哪些方法来解决分布式事务之前,先来看下什么是XA协议,XA协议是一种分布式事务的协议,规定了事务管理器和本地事务管理器两个角色,其中事务管理器负责管理本地事务管理器的提交和回滚,而本地事务管理器需要实现XA相关的接口,针对XA协议目前有两种具体的实现,就引出了解决分布式事务的其中两种方法,分别是2PC(2 phase commit)即2阶段提交,3PC(3 phase commit)即3阶段提交。另外还有一种是基于分布式消息的最终一致性方案

2:具体方案分析

2.1:2PC

2PC全称是2 phase commit,即两阶段提交,是XA协议的实现,包含一个事务管理器角色,多个本地事务管理器角色,本地事务管理器一般是具体的DB,如Oracle,MySQL等,这里的两阶段就代表了使用2个阶段来完成所有事务的提交,分别是投票阶段和提交阶段。

首先开始第一个阶段投票阶段,事务管理器向所有的本地事务管理器发送CanCommit消息,当本地事务管理器完成操作后,将修改写到redo,undo,但是没有写到磁盘(真正提交时执行这一步骤操作),如果操作成功则向事务管理器回复YES,否则返回NO,如下是这两种情况示意图:

在这里插入图片描述

接下来进入第二个阶段,即提交阶段,如果是所有的本地事务管理器都返回YES,则事务管理器会发送DoCommit,然后本地事务管理会提交事务,并释放相关数据库锁,以及其他占用的资源,执行完成后返回HaveCommited给事务管理器,如果是有一个本地事务管理器返回的是NO,事务管理器则会发送DoAbort,让所有的事务回滚,执行完成后返回HaveCommited给事务管理器,发送DoAbort的情况如下图发送Docommit情况类似

在这里插入图片描述

2PC两阶段提交的优点是实现简单,但是缺点也非常明显,如下:

1:同步阻塞,不管是在投票阶段,还是在提交阶段,在存在本地事务管理器没有响应结果给事务管理器时,所有的本地事务管理器都会处于阻塞状态,即临界资源不能被其他事务访问,如果是出现某本地事务管理器异常宕机,或者网络不通情况时,这种阻塞将会更加严重,服务器的性能会收到比较大的影响。
2:数据一致性问题,在提交阶段,事务管理器发送给所有本地事务管理器的Docommit消息,并不能保证所有的本地事务管理器都收到,可能因为网络原因丢失,也可能恰巧某些本地事务管理器出现宕机。比如A,B两个本地事务管理器,如果是A正常收到,则A会正常提交事务,而B出现宕机无法正常收到,则事务就不会正常提交,B重新启动后事务会自动回滚`(mysql InnoDB如此)`,此时就出现了数据一致性问题。这就是一个比较严重的问题了,因为出现了数据错误。
3:单点问题,当事务管理器出现故障时,整个系统将会停滞。当然如果是事务管理器是集群的话这个问题也可以被解决。

针对可能出现严重的同步阻塞,2PC进行升级就产生了3PC,即三阶段提交,接下来一起看下。

2.2:3PC

3 phase commit,即3阶段提交,是XA协议的实现,包含一个事务管理器角色,多个本地事务管理器角色,本地事务管理一般是具体的DB,如Oracle,MySQL等,这里的三阶段就代表了使用三个阶段来完成所有事务的提交,分别是CanCommitPreCommitDoCommit

首先是第一个阶段CanCommit,事务管理器向所有的本地事务管理器发送CanCommit消息,本地事务管理器仅仅检查是否可以顺利执行事务,不作任何实际的执行,可以执行返回YES,不能执行返回NO,返回YES和NO的情况如下图:

在这里插入图片描述

当存在返回NO的情况时,则停止,不进入第二个阶段,否则进入第二个阶段PreCommit,事务管理器向所有的本地事务管理器发送PreCommit,然后本地事务管理器开始执行事务,写redo,undo,执行成功的话则返回ACK给事务管理器(如果是超时也没有收到下一步执行,如DoCommit,Abort则自动回滚事务,这里会在一定程度上减少同步阻塞问题,不用死等),失败返回No,此时有以下三种情况:

1:如果是最终都成功返回ACK给事务管理器
2:如果是存在No
3:如果是事务管理器在超时前没有收到所有本地事务管理器的回复消息

对于23这里会在一定程度上减少同步阻塞问题,不用死等未响应的本地事务管理器),事务管理器都会发送Abort,回滚事务。对于1,则会正常进入第三个阶段DoCommit,
对于23,事务管理器都会发送Abort,回滚事务。对于1,则会正常进入第三个阶段DoCommit,事务管理器发送DoCommit消息给所有的本地事务管理器,完成事务的最终提交,完成回复ACK,完成整个事务,可能情况如下图:

在这里插入图片描述

3PC,三阶段提交的优点是在事务管理器和本地事务管理器都引入了超时机制,在一定程度上减轻了同步阻塞问题,虽然没有完全解决,但也有改善,缺点是依然存在数据一致性问题。

2.3:基于分布式消息的最终一致性

不管是2PC还是3PC都存在阻塞等待,数据一致性无法得到保证的问题,基于此便产生了基于分布式消息组件的异步事务处理机制,我们需要引入一个消息中间件来在多个应用之间转发消息,基于消息应用完成事务处理,如下图:

在这里插入图片描述

注意,这里的核心是消息中间件,必须保证数据不丢失,具备重试机制等,上一个事务在完成事务前需要保证发送给其他应用的消息都已经进行了持久化,这样才能保证其他事务最终都会执行(失败重试,或者是人工介入方式,但最终数据的状态一定是一致的),如下图(该图为大概示意)

在这里插入图片描述

实际场景可能如下图:

在这里插入图片描述

过程如下:

1:订单系统把订单消息发给消息中间件,消息状态标记为“待确认”。
2:消息中间件收到消息后,进行消息持久化操作,即在消息存储系统中新增一条状态为“待发送”的消息。
3:消息中间件返回消息持久化结果(成功 / 失败),订单系统根据返回结果判断如何进行业务操作。失败,放弃订单,结束(必要时向上层返回失败结果);成功,则创建订单。
4:订单操作完成后,把操作结果(成功 / 失败)发送给消息中间件。
5:消息中间件收到业务操作结果后,根据结果进行处理:失败,删除消息存储中的消息,结束;成功,则更新消息存储中的消息状态为“待发送(可发送)”,并执行消息投递。
6:如果消息状态为“可发送”,则 MQ 会将消息发送给支付系统,表示已经创建好订单,需要对订单进行支付。支付系统也按照上述方式进行订单支付操作。
7:订单系统支付完成后,会将支付消息返回给消息中间件,中间件将消息传送给订单系统。若支付失败,则订单操作失败,订单系统回滚到上一个状态,MQ 中相关消息将被删除;若支付成功,则订单系统再调用库存系统,进行出货操作,操作流程与支付系统类似。

但是这种方式无法同步的给用户返回操作结果,所以只能应用于用户不需要同步获取操作结果的场景。

写在后面

参考文章列表:

mysql xa协议_关于分布式事务,XA协议的学习笔记 。

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

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

相关文章

springboot够用就好系列-1.自定义LengthJudge注解校验字段长度

类似NonNull注解标注在参数之上,表示对应的值不可以为空,利用java的元注解及注解处理器实现检查属性长度的功能。 目录 程序效果 实现过程 样例代码 参考资料 程序效果 截图1.用户名超长提示 检查登录时“用户名”、“密码”字段的长度,此…

安全智能分析 环境迁移

环境迁移 Platfor m Ops for AI 作为整合了 DataOps、MLOps、ModelOps 的复杂技术平台,在项目开发时仅使用一套系统无法支撑平台的稳定搭建,往往需要开发系统、集成测试系统、正式 环境系统在项目生命周期 中协作配合。将表、索引、并发程序、配置内容等…

新手想做短视频可以选择什么领域,这三个可以无脑尝试

大家好,我是蝶衣王的小编 对于小白来说,如果你想通过短视频来赚钱,你不能在流行的领域去做。因为坑不是你能接受的,而且有太多的同行,你的竞争优势没法显现出来。下面分享一下新手适合做的短视频领域​。 一、盘点类型…

海思嵌入式开发-001-基于Ubuntu20.04搭建开发环境

海思嵌入式开发-001-基于Ubuntu20.04搭建开发环境一、虚拟机安装ubuntu20.041、安装虚拟机VMware2、基于虚拟机安装ubuntu20.04二、开发环境配置1、参考资料2、问题汇总一、虚拟机安装ubuntu20.04 1、安装虚拟机VMware 主机配置为Windows 10系统,CPU为i7-8550U 4核…

虹科新闻|ATTO 宣布支持 Apple 最新操作系统 macOS® 13 Ventura

一、即时发布 近期,虹科的合作伙伴ATTO公司宣布支持Apple最新操作系统macOS13 Ventura,所有HK-ATTO适配器、软件和实用程序都已经过新操作系统的测试和验证。 ATTO 34年来为数据密集型计算环境提供网络、存储连接和基础架构解决方案的全球领导者&#…

一文读懂什么是低代码开发?

世界在应用程序上运行,商业世界也不例外。面对变化,企业过去依赖的传统应用程序开发流程可能不再有效。从头开始构建软件解决方案需要花费数月甚至数年的时间来规划、设计、测试和部署。当您的组织需要快速解决方案时,等待负担过重的开发人员…

真实世界的人工智能应用落地——OpenAI篇 ⛵

💡 作者:韩信子ShowMeAI 📘 深度学习实战系列:https://www.showmeai.tech/tutorials/42 📘 本文地址:https://www.showmeai.tech/article-detail/414 📢 声明:版权所有,转…

CVE-2018-1273漏洞复现

今天继续给大家介绍渗透测试相关知识,本文主要内容是CVE-2018-1273漏洞复现。 免责声明: 本文所介绍的内容仅做学习交流使用,严禁利用文中技术进行非法行为,否则造成一切严重后果自负! 再次强调:严禁对未授…

Web3中文|未来的工作模式:VR头显、元宇宙和供应商协作

根据Meta最近发布的一份关于未来工作模式的报告,大约三分之一的美英劳动力在进行远程办公,因此企业必须重新定义工作方式和管理机制,并探索元宇宙和虚拟现实等创新领域。 报告称:“这将推动企业寻求更具创造性和创新性的方法来凝…

canal中间件集成springboot实战落地

目录 一、数据库开启相关权限功能: 二、canal 服务端配置启动:从官网下载程序和源码到本地环境 三、canal客户端配置启动: canal中间件集成springboot实战落地开始分享,这是目前互联网很常见的中间件,监听数据库变化…

Harbor镜像仓库的安装以及Docker从Harbor上传与下载镜像

Harbor镜像仓库的安装与使用 简介:Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器,除了Harbor这个私有镜像仓库外,还有Docker官方提供的Registry。相对Registry,Harbor具有很多优势,本文主要介绍Harbor镜像仓库的安…

Serivice案例

Serivice启动方式案例 1.案例1:-start方式启动 1.1创建服务 //服务类 public class MyService extends Service {//创建服务调用一次Overridepublic void onCreate() {System.out.println("onCreate");Toast.makeText(this, "onCreate", Toast.…

MySQL (三)------DDL操作数据库、DDL操作表

DDL操作数据库 1.1创建数据库(掌握) 语法 create database 数据库名 [character set 字符集][collate 校对规则] 注: []意思是可选的意思 字符集(charset):是一套符号和编码。 练习 创建一个day01的数据库(默认字符集) create database day01;…

List使用的坑

Arrays.asList的三个坑 1、不能转换基本数组类型(传数组进去,size1) 2、不支持增删操作(因为内部是一个final的数组) 3、对原始数组的修改会影响到我们获得的那个List 源码: 抽象List接口不支持新增 解决方案: 1、new ArrayList 2、java8…

4.移动端布局-flex布局**

1、传统布局和flex布局 传统布局:PC端 兼容性好布局繁琐局限性,不能在移动端很好的布局 flex布局:PC端、移动端操作方便,布局简单,移动端应用广泛PC端浏览器支持情况较差IE11或更低版本,不支持或仅部分支…

关于加密货币危机公关的智能钱包系列:该做和不该做哪些事情

我们的新一期 Twitter Spaces 为危机公关带来了加密镜头。与我们的主持人 Megan DeMatteo 一起出席本期节目的还有 Market Across 战略与消费者成功副总裁 Kim Bazak 和 Ambire CMO Vanina Ivanova。 Ambire Twitter Spaces 第 14 集以更广泛的视角来看待 FTX/Alameda 的故事。…

virtio虚拟化框架

virtio虚拟化 系统虚拟化技术是云计算最重要的核心技术之一。云计算平台的资源池化,资源统一管理以及后续的动态分配都是基于系统虚拟化技术才得以实现的。在计算机系统中,主要有计算资源,存储资源和网络资源。所以,系统虚拟化技术…

通讯录(3)

接着上一篇。 上一篇的指定删除还有一定的问题,我让用户输入要删除的联系人的名字,然后查询这个名字是否存在,再去删除。但是这里忽略了一个问题,如果两人名字一样呢?其它也有这样的问题,年龄&#xff0…

【vant组件安装】按需引入 完整引入 定制主题

vant官网:https://vant-contrib.gitee.io/vant/v2/#/zh-CN/定制主题: https://vant-contrib.gitee.io/vant/v2/#/zh-CN/theme 1. vant组件安装—按需引入 1.安装vant组件库 npm i vantlatest-v22.安装按需引入组件 npm i babel-plugin-import -D3.在babel.config.j…

cadence SPB17.4 - 从正常PCB文件反推原理图

文章目录cadence SPB17.4 - 从正常PCB文件反推原理图概述笔记用SPB17.4 allegro 出报表剩余的事情最重要的一件事情 - 核对整理出的原理图是否和PCB原图网络一致最后的事情备注ENDcadence SPB17.4 - 从正常PCB文件反推原理图 概述 和同学讨论问题, 他那有一个可以正常生产的立…