什么是分布式事务?

分布式事务跨越多个系统,确保所有操作一起成功或失败,这对于在现代计算环境中跨不同地理位置分离的资源维护数据完整性和一致性至关重要。
1. 为什么需要分布式事务?

分布式事务的需求源于确保分布式计算环境中多个独立系统或资源之间的数据一致性和可靠性的要求。
如上图所示,用户下了订单后,需要经过子系统Invetory和Payment两个服务处理,这两个服务是独立的微服务,要求这两个服务里面的事务要么同时成功,要么同时失败,由于是分处两个独立子系统,因此单个事务无法搞定两个系统的交易一致性!
这就需要用到分布式事务,它的主要特性如下:
1.1 一致性
确保作为事务的一部分所做的所有更改都以原子方式提交或回滚,从而维护数据完整性。
1.2 隔离性
保证并发事务不会互相干扰,维护数据完整性并防止冲突。
1.3 持久性
确认即使系统发生故障,已提交的事务仍然能够持续存在,从而确保可靠性。
1.4 原子性
确保事务中的所有操作要么全部成功完成,要么全部不成功完成,避免导致不一致的部分更新。
2. 分布式事务的工作原理
分布式事务的工作方式与简单事务相同,但挑战在于在多个数据库上实现它们。由于使用多个节点或数据库系统,会出现某些问题,例如网络故障,以维护额外硬件服务器和数据库服务器的可用性。为了成功进行分布式事务,可用资源由事务管理器协调。

分布式事务的工作原理
以下是针对该分布式事务流程一些步骤详解:
2.1 步骤 1:向资源申请 - 发出分布式事务
第一步是发出分布式事务。应用程序通过向可用资源发送请求来启动事务。请求包含详细信息,例如给定事务中每个资源要执行的操作。
2.2 步骤 2:资源 1 到资源 2 — 要求资源 2 准备提交
一旦资源收到事务请求,资源 1 就会联系资源 2 并要求资源 2 准备提交。此步骤确保两个可用资源都能够执行专用任务并成功完成给定的事务。
2.3 步骤 3:资源 2 到资源 1 – 资源 2 确认准备
第二步之后,资源 2 收到资源 1 的请求,准备提交。资源 2 向资源 1 做出确认响应,并确认已准备好继续执行分配的事务。
2.4 步骤 4:资源 1 到资源 2 — 要求资源 2 做出承诺
一旦资源 1 收到资源 2 的确认,它就会向资源 2 发送请求并提供提交事务的指令。此步骤确保资源 1 已完成给定事务中的任务,现在已准备好让资源 2 完成操作。
2.5 步骤 5:步骤 5:资源 2 至资源 1 – 资源 2 确认提交
当资源 2 收到来自资源 1 的提交请求时,它会向资源 1 提供响应并确认它已成功提交分配给它的事务。此步骤可确保资源 2 已完成操作中的任务,并确保两个资源都已同步其状态。
2.6 步骤 6:资源 1 至应用程序 — 接收交易确认
一旦资源 1 收到来自资源 2 的确认,资源 1 便会将交易确认发送回应用程序。此确认确认在多个资源之间执行的交易已成功完成。
3. 分布式事务的类型
分布式事务涉及跨多个节点或资源协调操作,以确保原子性、一致性、隔离性和持久性(ACID 属性)。以下是一些常见的类型和协议:
3.1 两阶段提交协议(2PC)
这是用来实现分布式事务原子性的经典协议。
- 它涉及两个阶段:准备阶段,所有参与者同意提交或中止事务;提交阶段,所有参与者同步执行决策。
- 2PC 确保所有涉及的资源都提交事务或都不提交,从而保持原子性。
3.2 三阶段提交协议(3PC)
3PC 通过添加额外阶段(预提交阶段)扩展了 2PC,以解决可能导致 2PC 中无限期阻塞的某些故障情况。
- 在3PC中,参与者首先同意准备提交,然后提交,最后完成或中止事务。
- 该协议旨在通过引入额外的决策阶段来降低 2PC 中出现的阻塞风险。
3.3 XA 事务

XA(扩展架构)事务是开放群组 (The Open Group) 定义的一种标准,用于协调跨异构资源(例如数据库、消息队列)的事务。
- XA 指定全局事务管理器(TM)和资源管理器(RM)之间的接口。
- TM 协调事务的生命周期,确保所有参与的 RM 以原子方式提交或回滚事务。
4. 实现分布式事务

分布式事务的实现方式如下:
4.1 交易管理器(TM)
- 事务管理器负责协调和管理跨多个资源管理器(例如数据库、消息队列)的事务。
- 即使涉及不同的资源,TM 也能确保事务遵守 ACID 属性(原子性、一致性、隔离性、持久性)。
4.2 资源经理(RM)
- 资源管理器负责管理分布式事务中涉及的各个资源(例如数据库、文件系统)。
- RM与TM交互,准备根据TM的协调提交或回滚事务。
4.3 协调协议
- 分布式事务的实现通常依赖于2PC、3PC等协调协议或Paxos、Raft等变体来达成共识。
- 这些协议确保事务中的所有参与者就提交或回滚达成一致的决定。
5. 分布式事务的优点
以下是分布式事务的优点:
5.1 数据一致性
分布式事务在多个资源之间提供数据一致性。各种操作在多个数据库资源之间进行协调。这确保系统即使在发生任何类型的故障时也能保持一致状态。
5.2 容错性
分布式系统可以处理故障并确保交易正确。如果参与资源在交易执行期间发生故障,则交易可以在备用资源上回滚并成功完成。
5.3 保证事务
分布式系统保证事务。它提供持久性和隔离性等功能。持久性确保如果提交了任何事务,即使发生任何故障,更改也会持续存在。
6. 分布式事务应用场景
分布式事务的应用如下:
6.1 企业资源规划 (ERP) 系统
ERP 系统由一个组织内的部门组成。因此,这里使用分布式事务来维护来自销售、库存、财务和人力资源管理等各个模块的事务。
6.2 云计算
分布式事务正在基于云的应用程序中得到使用。事务可以在多个数据源的帮助下完成,并确保数据更新和操作的一致性。
6.3 医疗保健系统
医疗保健系统在协调患者记录、为患者安排预约以及管理计费系统时使用分布式事务。分布式事务可维护医疗保健系统中的数据一致性和性能。
7. 分布式事务常见问题及其解答

7.1 跨地理分布的数据中心实现分布式事务一致性的主要挑战是什么?
处理网络延迟、潜在分区,并确保分散的数据中心之间的交易结果一致。
7.2 在云原生环境中,如何处理跨多个服务或微服务的长时间运行的分布式事务?
使用基于编排的 sagas 或补偿事务等模式来跨服务异步管理事务状态。
7.3 在分布式事务中,使用两阶段提交(2PC)和三阶段提交(3PC)协议之间的权衡是什么?
2PC 提供了更简单的原子性,但有阻塞的风险;3PC 增加了复杂性,减少了阻塞,但有可能增加延迟。
7.4 在什么场景中您会选择使用XA事务而不是自定义应用程序级分布式事务管理?
XA 事务适合与符合 XA 的系统集成,以实现标准化协调;自定义方法提供灵活性和性能优化。
7.5 在跨多个数据中心或云区域的异步数据传播的分布式系统中,如何维护事务的完整性和一致性?
使用分布式提交协议、幂等操作和冲突解决来确保即使出现网络延迟或故障也能实现一致的更新。
8. 结论
当使用多个资源(例如存储库或数据库系统)来执行事务时,将使用分布式事务。分布式事务提供各种好处,例如数据一致性,保证事务,并提高系统的整体性能和可扩展性。因此,分布式事务被用于各种应用程序以获得上述好处。
相关文章:
什么是分布式事务?
分布式事务跨越多个系统,确保所有操作一起成功或失败,这对于在现代计算环境中跨不同地理位置分离的资源维护数据完整性和一致性至关重要。 1. 为什么需要分布式事务? 分布式事务的需求源于确保分布式计算环境中多个独立系统或资源之间的数据…...
深入Java内存区域:堆栈、方法区与程序计数器的奥秘
引言 在Java开发过程中,合理地管理和利用内存资源对于提高程序的运行效率至关重要。特别是在大型项目或高并发场景下,一个小小的内存泄漏就可能导致整个系统崩溃。因此,掌握Java内存区域的相关知识,不仅能帮助我们更好地理解程序…...
【ML】异常检测、二分类问题
【ML】异常检测、二分类问题 1. 异常检测、二分类问题1.1 异常检测(Anomaly Detection)1.2 二分类问题(Binary Classification)1.3 异常检测与二分类问题的对比1.4 总结 2. 模型额训练与评估3. 为什么会出现比较高的误识别&#x…...
8.8-配置python3环境+python语法的使用
1.环境 python2 ,python3 [rootpython ~]# yum list installed|grep python [rootpython ~]# yum list installed|grep epel epel-release.noarch 7-11 extras #安装python3 [rootpython ~]# yum -y install python3…...
高质量WordPress下载站模板5play主题源码
5play下载站是由国外站长开发的一款WordPress主题,主题简约大方,为v1.8版本, 该主题模板中包含了上千个应用,登录后台以后只需要简单的三个步骤就可以轻松发布apk文章, 我们只需要在WordPress后台中导入该主题就可以…...
【C++】类的概念与基本使用介绍
C类是面向对象编程(OOP)的基础,它允许我们将数据(属性)和行为(方法)封装在一起,形成一个自定义的数据类型。以下是C类的基本概念、特点、特性以及使用注意事项,最后会提供…...
基于Python和OpenCV的图像处理的轮廓查找算法及显示
文章目录 概要轮廓查找算法示例代码代码解释小结 概要 在图像处理中,轮廓查找是一个重要的步骤,它可以帮助我们识别图像中的形状和边界。Python结合OpenCV库可以非常方便地实现这一功能。本文将详细介绍如何使用Python和OpenCV来查找图像中的轮廓&#…...
使用ant design的modal时,发现自定义组件的样式(组件高度)被改变了!
一 问题描述 在项目中,自定义了一个组件,分别在界面和 antd的modal中都有使用到。但是突然发现,界面中的组件样式跟modal中的组件样式高度不一样。modal中的组件整体要比页面中的组件要高一点。 项目中的自定义组件比较复杂,因此&…...
NLP从零开始------8文本进阶处理之文本向量化
1. 文本向量化概述 随着计算机计算能力的大幅度提升,机器学习和深度学习都取得了长足的发展。NLP越来越多的通过应用机器学习和深度学习工具解决问题,例如通过深度学习模型从网络新闻报道中分析出关键词汇与舆论主题并构建关系图谱。在这种背景下&#x…...
【网络编程】字节序,IP地址、点分十进制、TCP与UDP的异同
记录学习,思维导图绘制 目录 1、字节序编辑 2、IP地址 3、点分十进制 4、TCP与UDP的异同 1、字节序 2、IP地址 3、点分十进制 4、TCP与UDP的异同...
关于k8s的pvc存储卷
目录 1.PVC 和 PV 1.1 PV 1.2 PVC 1.3 StorageClass 1.4 PV和PVC的生命周期 2.实战演练 2.1 创建静态pv 2.2 创建动态pv 3.总结 1.PVC 和 PV 1.1 PV PV 全称叫做 Persistent Volume,持久化存储卷。它是用来描述或者说用来定义一个存储卷的,…...
【物联网设备端开发】ESP开发工具:QEMU的使用方法
概要 本文提供了一些运行QEMU的ESP特定说明。有关QEMU的一般使用问题,请参阅官方文档:https://www.qemu.org/documentation/. 编译 QEMU 准备工作 在此之前,请查看有关构建先决条件的QEMU文档。如果你在Linux主机上构建QEMU,你…...
c++中std::endl 和“\n“ 这两个换行符有什么区别
std::endl 和 "\n" 都用于在C中生成换行符,但它们之间有一些重要的区别 std::endl: 功能:输出一个换行符,并刷新输出流(即缓冲区)。作用:确保所有数据立即输出到目的地,例…...
http中get和post怎么选
5.4.2.怎么选择1.如果你是想从服务器上获取资源,建议使用GET请求,如果你这个请求是为了向服务器提交数据,建议使用POST请求。2.大部分的form表单提交,都是post方式,因为form表单中要填写大量的数据,这些数据…...
数据分析及应用:快手直播间人员在线分析
目录 0 需求描述 1、进入直播间的高峰期为?(以进入用户数衡量) 2、晚上 11 点,哪个直播间的进入人数最多? 3、20:00-23:00,娱乐类、搞笑类,进入人数最多直播间分别是? 4、娱乐类、搞笑类,人均在线时长(退出时间-进入时间)最长的直播间分别是? 5、同时在线人数…...
【Python】nn.nn.CircularPad1、2、3d函数和nn.ConstantPad1、2、3d函数详解和示例
前言 在深度学习中,尤其是在处理图像、音频或其他多维数据时,数据填充(Padding)是一个常见的操作。填充不仅可以保持数据的空间维度,还能在卷积操作中避免信息丢失。PyTorch提供了多种填充方式,其中nn.Cir…...
LearnOpenGL——混合、面剔除
LearnOpenGL——混合、面剔除 混合 Blending一、丢弃片段 Alpha Test二、混合 Alpha Blending渲染顺序 面剔除一、环绕顺序二、面剔除 混合 Blending OpenGL中,混合(Blending)通常是实现物体透明度(Transparency)的一种技术。透明的物体可以是完全透明的࿰…...
视频网站为何热衷于SCDN
视频网站为何热衷于SCDN?随着互联网技术的飞速发展,视频网站已成为人们日常生活中不可或缺的一部分。无论是观看高清电影、热门剧集,还是直播体育赛事、游戏竞技,视频网站都以其丰富的内容和便捷的访问方式吸引了无数用户。然而&a…...
Redis与DataBase保持数据一致性
文章目录 1. 读取数据2. 写数据2.1 先操作缓存2.2 先操作数据库 在我们系统中缓存最常用的策略是:服务端需要同时维系DB和Cache,并且是以DB的结果为准, Cache-Aside Pattern(缓存分离模式、旁路缓存)。 1. 读取数据 当…...
解决 MacOS 连接公司 VPN 成功但是不能网络的问题
目录 解决办法2024 Mac mini 爆料 解决办法 操作比较简单,修改配置文件即可(如果没有则需要手动创建)。 sudo vim /etc/ppp/options在此文件下,加入 plugin L2TP.ppp: plugin L2TP.ppp如果文件里有l2tpnoipsec&…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...
.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...
LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...
学校招生小程序源码介绍
基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...
前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...
在WSL2的Ubuntu镜像中安装Docker
Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...
分布式增量爬虫实现方案
之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面,避免重复抓取,以节省资源和时间。 在分布式环境下,增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路:将增量判…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...
