分布式事务入门 一

news2024/12/27 7:00:46

分布式事务入门  一

您好,我是今夜写代码,今天学习下分布式事务相关理论,以及常见的解决方案,为后续掌握Seata分布式事务框奠定基础。

为什么需要分布式事务?

分布式事务主要由于存储资源的分布性,通常涉及多个数据库。 分布式事务一般存在如下场景

  • 数据分库存储

    当单个数据库实例的性能、连接数等无法满足应用数据存储和查询时,这时我们需要对业务数据进行分库存储,此时事务需要跨多个独立的数据库实例进行操作,保证多个数据库实例数据一致性问题,也就是分布式事务问题。

  • 微服务架构

    在微服务架构下,每个服务都有各自独立的数据库存储自身业务数据, 而完成某项功能可能涉及很多的服务的互相调用,然而每个服务只能控制自己本地事务的提交与回滚, 因此无法保证全局数据一致性,这也是典型的分布式事务问题。

消息队列异步更新 

对于一些简单的业务,数据不要求强一致性时,我们可以使用消息队列异步通知下游系统更新数据。这种方式相信大家并不陌生。这种方式好处是:

  • 解耦,实现简单

    服务之间不需要耦合,扩展性好,新的服务依赖上游数据,只需要监听对应的消息即可。

  • 性能较好

    使用消息队列实现异步更新,避免同步阻塞,同时消息队列可以作为缓冲,能起到流量削锋作用。

不过这种方式只能保证数据最终一致性,由于消息队列本身可能存在延迟,失败重试等情况,对于一些强一致性场景是无法容忍的,比如电商场景很可能出现超卖问题。对于强一致性的场景,我们需要使用分布式事务保证数据的一致性。

图片

XA协议 

XA 协议(X/Open Distributed Transaction Processing, DTP)是一种用于管理分布式事务的标准协议,它使用两段提交(Two-Phase Commit, 2PC)保证事务的完整性,目前的分布式事务解决方案基本都是从两段提交演化来的。

主流的关系型数据库管理系统如MySQL 都支持XA 协议。

两段提交

图片

  • 准备阶段:事务协调者通知所有事务参与者准备分支事务事务参与者执行事务,记录事务日志,但不提交事务,然后告知协调者通知事的执行结果。

  • 提交/回滚阶段: 所有事务参与者明确返回成功 ,事务协调者发起提交事务指令,所有参与者执行提交事务操作。反之若有事务参与者反馈事务执行失败,事务协调者发起回滚指令,则所有事务参与者回滚事务。

两段提交存在的问题

  • 同步阻塞

    所有参与者事务都是同步阻塞的,这期间其他节点访问参与者占用的资源都会被阻塞。

  • 单点故障问题

    所有参与者需要等待事务协调者指令才能进行下一步,如果事务协调者出现单点故障,事务参与者将一直阻塞下去,资源也无法释放。

  • 数据不一致

    如果提交或者回滚阶段,如果部分参与者未收到通知,会一直阻塞下去,从而数据不一致。

三段提交 

图片

  • CanCommit (询问阶段):

    事务协调者事务参与者发送执行事务请求,事务参与者只需要回答是或不是,不需要正真事务操作,如果有参与者超时,则终止事务

  • PreCommit (准备阶段)

    根据反馈结果决定是否继续执行,如果所有参与者反馈"Yes",向事务参与者发送PreCommit请求,事务参与者收到请求执行事务, 写redo 和 undo日志,但不提交事务; 反之如果有参与者反馈"No" 或者有参与者超时没有反馈,则发送中断事务请求。

  • DoCommit (提交阶段)

    如果PreCommit 所有事务参与者都返回成功,事务协议者发起提交事务请求,反之有参与者执行失败,或者超时未反馈结果发起执行回滚操作。

三段提交做了哪些改进?

增加CanCommit阶段,初步确认参与者是否可以执行事务,避免不必要的资源锁定,超时机制提前发现不健康节点。

三段提交每个阶段都有超时机制,利用超时机制解决避免长时间锁定资源,一旦超时仍可能出现数据不一致情况。 相对于两段提交,资源不会一直被锁定。

当然三段提交实现起来要比两段提交复杂,对于大多数应用来说,2PC仍然是处理分布式事务的标准方法。

未完待续 

本文只是介绍分布式事务相关概念,实际使用更多的选择集成Spring Cloud Seata。Seata 是一个开源的分布式事务解决方案,并且我们可以根据实际场景选择不同的模式,如Saga模式、TCC模式。

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

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

相关文章

VSCode设置Playwright教程

1.安装扩展 打开VS Code,在扩展—>搜索"Playwright Test for VSCode",点击安装 按快捷键CommandShiftP,输入install playwright,点击安装Playwright 安装成功会有如下提示 2.调试脚本 打开tests/example.spec.ts文…

在一个C工程文件中,如果一个函数要引用另一个文件中的函数,并不是用extern进行声明,而是在包含的头文件中进行声明

在C语言的某个工程中,一个不是主函数的函数如果引用另一个文件中的某个函数,是不是要先用extern引入?比如下面的代码: void DisplayInit(void) {extern void FramebufferInit(void);FramebufferInit(); }在C语言中,不…

Qt天气预报系统设计_更改窗口名称和图标

Qt 天气预报系统 1、更改窗口名称2、更改窗口图标2.1先把资源加入项目2.2选择资源文件更改窗口图标 1、更改窗口名称 更改MainWindow下的windowTitle即可 2、更改窗口图标 2.1先把资源加入项目 右键项目文件夹,选择 Add New... 选择Qt,接着选择 Qt …

数据仓库工具箱—读书笔记02(Kimball维度建模技术概述04、使用一致性维度集成)

Kimball维度建模技术概述 记录一下读《数据仓库工具箱》时的思考,摘录一些书中关于维度建模比较重要的思想与大家分享🤣🤣🤣 第二章前言部分作者提到:技术的介绍应该通过涵盖各种行业的熟悉的用例展开(赞同…

Matlab 和 R 语言的数组索引都是从 1 开始,并且是左闭右闭的

文章目录 一、前言二、主要内容三、小结 🍉 CSDN 叶庭云:https://yetingyun.blog.csdn.net/ 一、前言 在早期的计算机科学中,数组索引从 1 开始是很常见的。例如,Fortran 和 Pascal 等编程语言也采用了从 1 开始的索引。 这种索引…

Redis - Token JWT 概念解析及双token实现分布式session存储实战

Token 定义:令牌,访问资源接口(API)时所需要的资源凭证 一、Access Token 定义:访问资源接口(API)时所需要的资源凭证,存储在客户端 组成 组成部分说明uid用户唯一的身份标识time…

vue3使用video-player实现视频播放(可拖动视频窗口、调整大小)

1.安装video-player npm install video.js videojs-player/vue --save在main.js中配置全局引入 // 导入视频播放组件 import VueVideoPlayer from videojs-player/vue import video.js/dist/video-js.cssconst app createApp(App) // 视频播放组件 app.use(VueVideoPlayer)2…

数据库MySQL(1)

一、数据库简介 数据库是一类软件,其作用就是更加高效的组织数据,我们要讲的数据库软件是MySQL,MySQL所使用的是sql语句,SQL语句就是专门操作数据库的编程语言 数据库组织形式为:数据库→表→行→列 每一个数据库里…

启动动效流程梳理(二)

performSurfacePlacementNoTrace() 这一段从performSurfacePlacement()开始讲起,因为在trace中可以看到在SystemServer中,动效会从performSurfacePlacement这个tag点触发。这里的流程就是在窗口状态改变之后,会触发performSurfacePlacement流…

js-000000000000

1、js书写的位置 - 内部 <body> <!-- 习惯把 js 放到 /body 的后面 --> <script> console.log(这是内部 js 的书写位置) alert(内部js) </script> </body> <body><!-- 习惯把 js 放到 /body 的后面 --><script>console.log(这…

深度学习工作:从追求 SoTA 到揭示新现象

TLDR&#xff1a;主要讨论了从追求模型 SoTA 到揭示新现象的转变。通过几个例子&#xff0c;包括ACNet到RepVGG的发展&#xff0c;RIFE插帧、Film插帧&#xff0c;以及OpenAI的近期工作&#xff0c;阐述了这种转变的重要性。 知乎&#xff1a;黄哲威 hzwer链接&#xff1a;http…

USB Hub 检测设备

系列文章目录 xHCI 简单分析 USB Root Hub 分析 USB Hub 检测设备 文章目录 系列文章目录一、引言二、hub_eventshub_port_connect_changeusb_alloc_devusb_set_device_statehub_port_initusb_new_device 一、引言 USB Hub 检测设备 一文中讲到&#xff0c;当有 USB 插入时&…

upload-labs关卡记录13

这里和关卡12非常类似&#xff0c;唯一不同就是12关用到get方法&#xff0c;这里用到post方法。因此对应的截断方式也不一样&#xff0c;依旧是使用我们的bp进行抓包&#xff0c; 然后依旧是在upload后加上shell.php&#xff0c;这里用是为了hex时好区别我们要在哪里更改&#…

鸿蒙UI开发——使用WidthTheme实现局部深浅色

1、场景描述 在实际的应用开发中&#xff0c;我们可能需要在界面中局部应用深色或者浅色的界面样式&#xff0c;与全局的深色、亮色同时生效。场景例如&#xff1a;深/亮色预览。此时&#xff0c;我们可以使用WithTheme能力来达到我们的效果。 2、WithTheme WithTheme组件可…

骑砍2霸主MOD开发(26)-Mono脚本系统

一.游戏启动流程 <1.启动器Launcher 运行TaleWorlds.MountAndBlade.Launcher.exe启动C#程序Program,完成MOD列表页面的加载. public class Program {public static void Main(string[] args){#加载启动器GUI界面ResourceDepot resourceDepot new ResourceDepot();resource…

Gmsh有限元网格剖分(Python)---点、直线、平面的移动

Gmsh有限元网格剖分(Python)—点、直线、平面的移动和旋转 最近在学习有限元的网格剖分算法&#xff0c;主要还是要参考老外的开源Gmsh库进行&#xff0c;写一些博客记录下学习过程&#xff0c;方便以后回忆嘞。 Gmsh的官方英文文档可以参考&#xff1a;gmsh.pdf 但咋就说&a…

代码随想录Day39 198.打家劫舍,213.打家劫舍II,337.打家劫舍 III。

1.打家劫舍 力扣题目链接(opens new window) 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房屋在同一晚上被小偷闯入&#xff0c;系统…

01-linux基础命令

一、linux命令概述 命令 选项 参数命令 &#xff1a;就是命令名&#xff1b;选项&#xff1a;一般以 - 开头 比如&#xff1a;-a -p -r 等扩展命令的功能&#xff1b;参数&#xff1a;描述命令的目标&#xff0c;如我们要打开一个文件的话&#xff0c;参数就是要打开的文件名…

MATLAB符号计算-初步认识符号对象

1.1自顶向下的程序设计方法 【例1-1】列主元Guass消去法解方程组 a[2 -3 5 -1;1 4 2 -3;-2 4 -3 -7;8 0 -2 1]; b[3 7 -1 8]; sLZYguass(a,b) 代码还有问题&#xff0c;x11.1913,x21.1157,x30.8114,x40.0923 学长帮忙修改过&#xff1a; 反思&#xff1a; length()、size(…

支持向量机入门指南:从原理到实践

目录 1 支持向量机的基本概念 1.2 数学表达 2 间隔与支持向量 2.1 几何间隔 2.2 支持向量的概念 2.3 规范化超平面 2.4 支持向量的深入分析 2.4.1 支持向量的特征 2.4.2 支持向量的作用 2.4.3 支持向量的代数表示 2.5 KKT条件 3 最优化问题 3.1 问题的形成 3.2 规…