分布式事务,你了解多少?(上)
本文主要是讲述分布式事务的理论及常用的技术方案,主要源自各类学习和工作总结,如有不妥之处,还望指正。分布式事务的其他基础请自行查阅资料。
一、分布式事务产生的原因
分布式事务的产生,源自互联网、电商等的发展,当同一个系统不同模块不同业务的数据在一个存储设备里,随着业务的发展,系统逐渐满足不了业务的发展时,常用的手段就是“拆”,拆的手段有垂直拆分和水平拆分,针对业务模块和数据库存储,都可以进行垂直拆分和水平拆分。拆分后就会存在不同的业务使用自己的数据库进行存储,这就会导致一个操作需要进行跨数据库操作。这就是分布式事务产生的最基本的原因所在。而我们知道,只要是事务,必须要满足事务的四性(ACID),为了使事务的四性得到满足,业内使用了多种技术手段,但各种技术手段都有其优点和缺点。
事务的四性(ACID):Automicity(原子性)、Consistency(一致性)、Isolation(隔离性)、Durability(持久性)。
比如:电商的下单,里面包含写订单表、扣减商品库存、写财务结算,订单信息、商品库存、财务模块按业务已经拆分到不同的模块,各自有属于自己的数据库,这个时候就是一个典型的分布式事务场景。
二、理论基础
此处主要说2个理论基础,一个是分布式的CAP定理,一个是BASE理论。
CAP:指的是在一个分布式系统中,一致性(Consistency)、可用性(Availability)、分区容错性(Partition tolerance)这三个要素最多只能同时实现两点,不可能三者兼顾。在分布式场景中,由于网络硬件等客观因素,网络之间的通信可能会存在中断、丢包等情况,所以分区容错性(Partition tolerance)是我们分布式场景中必须要满足的,三要素中就只能有有这2种组合:CP和AP。
AP:AP模型强调的是系统的可用性,在做系统设计时,需要优先考虑可用性;
CP:CP模型强调的是系统的一致性,在做系统设计时,需要优先考虑一致性;
基于CAP定理的AP模型和CP模型,又演化出了BASE理论。BASE是Basically Available(基本可用)、Soft state(软状态)和Eventually consistent(最终一致性)的简写。核心是既然没办法做到强一致性,但每一个应用都可根据自身的业务特点采用适当的方式来达到最终一致性。
Basically Available(基本可用):指系统出现不可预知的故障时,允许损失部分可用性,但这绝不等价于不可用。比如:系统某功能的正常响应时间是0.1秒,但由于系统出现异常(机房断电、光纤挖断等)系统功能的响应时间升到1-2秒;再比如电商的大促或秒杀,为了保证系统的稳定性,当用户流量超过了系统阈值,可把部分用户引流到一个降级页面。
Soft state(软状态):与硬状态相对。系统中的数据存在中间状态,并认为该中间状态不影响系统的整体可用性,即表示数据副本之间的同步有延迟。
Eventually consistent(最终一致性):系统中的所有数据副本,在经过一段时间后,所有数据的状态都能达到一个最终的一致的状态。
三、刚性分布式事务
刚性分布式事务的特点是:数据的状态强调的是强一致性,系统能支持的并发低,事务执行的时间都比较短,属于短事务,所有数据在事务内同步执行。刚性分布式事务遵循XA协议,通过实现XA的接口来实现分布式事务。XA规范由AP(Application Program)、RM(Resource Manager)、TM(Transaction Manager)组成。
AP:定义事务的开始和结束,并访问事务内的资源;
RM:通常指的就是数据库资源;
TM:负责管理事务,分配事务的唯一标识、监控事务的执行情况、并负责事务的提交、回滚等操作;
下面列出一些常见的实现XA协议的分布式事务方法。
两阶段提交(2PC):
也是XA的标准实现,分为准备阶段和提交阶段,时序图如下:
AP向TM发起commit请求,TM向RM发送prepare,当TM收到所有的RM返回的ok消息后,TM再向所有的RM发送commit指令,待收到所有的RM返回的ok消息后,commit才算完成。在prepare阶段,当有一个RM返回失败的时候,则不能进行第二步的commit操作,TM释放所有占用的资源;在commit阶段,当有一个RM返回失败时,则TM都要协调commit进行补偿,保证所有提交到RM的commit请求,要么都成功、要么都失败。
2PC的缺点:
1、同步阻塞:所有参与事务的资源都处于阻塞状态;
2、TM瓶颈:当TM故障时,所有的参与者都将被锁定,资源得不到释放;
3、RM资源锁定时间过长;
4、全局锁定(隔离级别串行化),不适合长事务,并发低;
基于2PC的缺点,又提出三阶段(3PC)提交。
三阶段(3PC)提交:
三阶段(3PC)提交分为CanCommit、PreCommit和DoCommit三个阶段,时序图如下:
CanCommit:TM向所有RM发出CanCommit指令,RM收到指令后,判断可否提交事务,如果可以返回ok,否则返回no;
PreCommit:当TM收到所有RM都返回CanCommit的结果为ok时,TM向所有RM发出PreCommit;当有一个RM返回no或超时,导致TM没收到反馈则事务中断,TM向所有RM发出abort终止事务,TM收到abort后终止事务,释放资源。如果RM没收到TM发出的abort或是超时,则RM也会中断自身的事务,释放资源;
DoCommit:TM收到所有RM都返回PreCommit的结果为ok时,TM向所有RM发出DoCommit,执行事务真正的提交,TM收到所有RM的DoCommit的执行结果为ok时,释放所占用的所有资源;当有一个RM返回no或超时,导致TM没收到反馈则事务中断,TM向所有RM发出abort终止事务,各个RM收到abort后利用CanCommit阶段的Undo信息执行回滚操作,释放占用的资源;但是,如果RM没收到TM发出的abort或是超时后,则RM会继续提交事务,这将导致数据的不一致。
三阶段相比两阶段,优点有:降低阻塞范围;TM瓶颈问题得到部分解决,即在第一二阶段时,当超时的时候RM会自动释放资源,不依赖TM。但进入第三阶段后,如果超时则不会释放资源,而会继续提交事务,这种情况下,将导致数据的不一致。
本篇到这结束,下一篇继续解析柔性分布式事务。
————————————————
版权声明:本文为CSDN博主「liaozxbj」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/liaozxbj/article/details/105436515
相关文章:
分布式事务,你了解多少?(上)
本文主要是讲述分布式事务的理论及常用的技术方案,主要源自各类学习和工作总结,如有不妥之处,还望指正。分布式事务的其他基础请自行查阅资料。 一、分布式事务产生的原因 分布式事务的产生,源自互联网、电商等的发展,…...
ClickHouse主键索引最佳实践
在本文中,我们将深入研究ClickHouse索引。我们将对此进行详细说明和讨论: ClickHouse的索引与传统的关系数据库有何不同ClickHouse是怎样构建和使用主键稀疏索引的ClickHouse索引的最佳实践 您可以选择在自己的机器上执行本文给出的所有Clickhouse SQL…...
Flink 基础 -- 应用开发(项目配置)
1、概述 本节中的指南将向您展示如何通过流行的构建工具(Maven, Gradle)配置项目,添加必要的依赖项(即连接器和格式,测试),并涵盖一些高级配置主题。 每个Flink应用程序都依赖于一组Flink库。至少,应用程序依赖于Flink api&…...
空间曲面@常见曲面方程
文章目录 曲面的基本问题特殊曲面球面方程球的标准形方程一般形方程例 柱面柱面方程不同维度下同方程的图形常见柱面方程 旋转曲面旋转曲面的方程旋转情况分类以yOz上的曲线绕 z z z轴旋转为例 旋转曲面的方程常见旋转曲面方程 锥面其他曲面 曲面的基本问题 根据曲面(点的几何…...
unity 接收和发送Udp消息
因为需要用到unity和其他的程序交互,其他程序可以提供Udp消息,因此找了合适的相互连接方法。这里直接上代码。 工具类: using System; using System.Collections; using System.Collections.Generic; using System.IO; using System.Net; u…...
机器学习股票大数据量化分析与预测系统 - python 计算机竞赛
文章目录 0 前言1 课题背景2 实现效果UI界面设计web预测界面RSRS选股界面 3 软件架构4 工具介绍Flask框架MySQL数据库LSTM 5 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 机器学习股票大数据量化分析与预测系统 该项目较为新颖&am…...
架构描述语言(ADL)
1.架构描述语言(ADL) 架构描述语言(Architecture Description Language, ADL)是一种为明确说明软件系统的概念架构和对这些概念架构建模提供功能的语言。 2.ADL基本构成要素 ADL即架构描述语言,其基本构成要素包括:…...
GZ038 物联网应用开发赛题第2套
2023年全国职业院校技能大赛 高职组 物联网应用开发 任 务 书 (第2套卷) 工位号:______________ 第一部分 竞赛须知 一、竞赛要求 1、正确使用工具,操作安全规范; 2、竞赛过程中如有异议,可向现场考评人员反映,不得扰乱赛场秩序; 3、遵守赛场纪律,尊重考评人员,…...
Go 接口:Go中最强大的魔法,接口应用模式或惯例介绍
Go 接口:Go中最强大的魔法,接口应用模式或惯例介绍 文章目录 Go 接口:Go中最强大的魔法,接口应用模式或惯例介绍一、前置原则二、一切皆组合2.1 一切皆组合2.2 垂直组合2.2.1 第一种:通过嵌入接口构建接口2.2.2 第二种:通过嵌入接…...
Vue3全局共享数据
目录 1,Vuex2,provide & inject2,global state4,Pinia5,对比 1,Vuex vue2 的官方状态管理器,vue3 也是可以用的,需要使用 4.x 版本。 相对于 vuex3.x,有两个重要变…...
openai自定义API操作 API 返回值说明
custom-自定义API操作 openai.custom 公共参数 名称类型必须描述keyString是调用key(获取测试key)secretString是调用密钥api_nameString是API接口名称(包括在请求地址中)[item_search,item_get,item_search_shop等]cacheStrin…...
jsp基本表格和简单算法表格
基本表格; <% page language"java" contentType"text/html; charsetUTF-8"pageEncoding"UTF-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd…...
在线存储系统源码 网盘网站源码 云盘系统源码
Cloudreve云盘系统源码-支持本地储存和对象储存,界面美观 云盘系统安装教程 测试环境:PHP7.1 MYSQL5.6 Apache 上传源码到根目录 安装程序: 浏览器数据 http://localhost/CloudreveInstallerlocalhost更换成你的网址 安装完毕 记住系统默认的账号密码 温馨提示:如果默认…...
线性代数(六)| 二次型 标准型转换 正定二次型 正定矩阵
文章目录 1. 二次型化为标准型1.1 正交变换法1.2 配方法 2 . 正定二次型与正定矩阵 1. 二次型化为标准型 和第五章有什么样的联系 首先上一章我们说过对于对称矩阵,一定存在一个正交矩阵Q,使得$Q^{-1}AQB $ B为对角矩阵 那么这一章中,我们…...
Kotlin系列之注解详解
目录 注解:file:JvmName 注解:JvmField 注解:JvmOverloads 注解:JvmStatic 注解:JvmMultifileClass 注解:JvmSynthetic 注解:file:JvmName file:JvmName(“XXX”) 放在类的最顶层&#x…...
Go 面向对象,多态,基本数据类型
程序功能解读 第一行为可执行程序的包名,所有的Go源文件头部必须有一个包生命语句,Go通过包名来管理命名空间。 第三行import是引用外部包的说明 func关键字声明定义一个函数,如果是main则代表是Go程序入口函数 Go源码特征解读 源程序以.g…...
使用 Python修改JSON 文件中对应键值
文章目录 前言代码分析 前言 在日常的数据处理工作中,经常需要对 JSON 文件进行读取和修改。在 Python 中,处理 JSON 文件非常方便。本文将通过一个简单的示例程序来演示如何读取和修改 JSON 文件。 代码分析 首先,需要导入 json 和 os 模块…...
【Rust日报】2023-11-08 RustyVault -- 基于 rust 的现代秘密管理系统
RustyVault -- 基于 rust 的现代秘密管理系统 RustyVault 是一个用 Rust 编写的现代秘密管理系统。RustyVault 提供多种功能,支持多种场景,包括安全存储、云身份管理、秘密管理、Kubernetes 集成、PKI 基础设施、密码计算、传统密钥管理等。RustyVault 可…...
07【保姆级】-GO语言的程序流程控制【if switch for while 】
之前我学过C、Java、Python语言时总结的经验: 先建立整体框架,然后再去抠细节。先Know how,然后know why。先做出来,然后再去一点点研究,才会事半功倍。适当的囫囵吞枣。因为死抠某个知识点很浪费时间的。对于GO语言&a…...
求2个字符串的最短编辑距离 java 实现
EditStepInfo.java: import lombok.Getter; import lombok.Setter;import java.io.Serializable; import java.util.List;Getter Setter public class EditStepInfo implements Serializable {private String str1;private String str2;// str1和 str2 的最短编辑路…...
告别卡顿!实测用yuzu模拟器在Win10电脑流畅玩《宝可梦 剑/盾》的完整配置流程
告别卡顿!实测用yuzu模拟器在Win10电脑流畅玩《宝可梦 剑/盾》的完整配置流程 对于许多Switch玩家来说,《宝可梦 剑/盾》无疑是近年来最令人期待的作品之一。然而,并非所有玩家都拥有Switch主机,或者希望在便携设备上体验这款游戏…...
CardEditor:桌游卡牌设计的革命性批量生成解决方案
CardEditor:桌游卡牌设计的革命性批量生成解决方案 【免费下载链接】CardEditor 一款专为桌游设计师开发的批处理数值填入卡牌生成器/A card batch generator specially developed for board game designers 项目地址: https://gitcode.com/gh_mirrors/ca/CardEdi…...
Ash Framework与Phoenix集成:构建完整Web应用的终极指南
Ash Framework与Phoenix集成:构建完整Web应用的终极指南 【免费下载链接】ash A declarative, extensible framework for building Elixir applications. 项目地址: https://gitcode.com/gh_mirrors/ash/ash Ash Framework是一个声明式、可扩展的Elixir应用框…...
Phi-4-mini-flash-reasoning部署指南:Web工作台一键启用长文本推理
Phi-4-mini-flash-reasoning部署指南:Web工作台一键启用长文本推理 1. 模型介绍 Phi-4-mini-flash-reasoning 是一款专为复杂推理任务优化的轻量级文本模型,特别适合需要多步思考和分析的场景。不同于常规的文本生成模型,它更擅长ÿ…...
深度学习图像描述数据集构建全流程解析
1. 项目概述:构建深度学习图像描述数据集的核心逻辑在计算机视觉与自然语言处理的交叉领域,图像描述生成(Image Captioning)一直是极具挑战性的任务。这个项目的本质,是通过系统化的数据工程方法,将原始图像…...
从信号处理到图像压缩:用Python手把手理解傅里叶矩阵与FFT的底层原理
从信号处理到图像压缩:用Python手把手理解傅里叶矩阵与FFT的底层原理 在数字信号处理领域,傅里叶变换就像一把瑞士军刀,它能将时域信号分解为频域成分,这种能力在音频分析、图像压缩和通信系统中发挥着核心作用。但你是否想过&…...
别再死磕Reduce Side Join了!用Map Side Join优化你的Hadoop数据处理流程(附完整代码)
突破性能瓶颈:Map Side Join在电商数据处理中的实战优化 当订单数据量突破千万级时,传统的Reduce Side Join开始显露出致命缺陷——我曾在一个深夜被报警电话惊醒,集群因OOM崩溃,而第二天早晨就是季度财报会议。这次事故让我彻底放…...
LSTM超参数调优实战:时间序列预测指南
1. LSTM超参数调优实战:基于Keras的时间序列预测指南在时间序列预测领域,LSTM(长短期记忆网络)因其出色的序列建模能力而广受欢迎。但要让LSTM模型真正发挥威力,超参数调优是不可或缺的关键步骤。不同于传统机器学习模…...
AI 在软件开发中的角色:工具、场景、效率与未来趋势深度研究报告
核心摘要与关键发现截至 2026 年 4 月,人工智能(AI)已从软件开发的 “辅助工具” 演进为 “核心协同引擎”—— 这一转变并非线性的功能增强,而是软件工程范式的根本性重构:AI 不再是简单的代码补全工具,而…...
【C++26反射工业级应用禁地】:为什么头部自动驾驶公司已禁用传统模板元编程,全面迁移至`std::reflect`?
更多请点击: https://intelliparadigm.com 第一章:C26反射元编程的工业级演进动因 现代C系统软件正面临前所未有的复杂性挑战:微服务网关需在编译期校验协议字段兼容性,嵌入式固件要求零运行时开销的序列化配置注入,金…...
