分布式事务入门 一

分布式事务入门  一

您好,我是今夜写代码,今天学习下分布式事务相关理论,以及常见的解决方案,为后续掌握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.mzph.cn/diannao/65390.shtml

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

相关文章

Goland:专为Go语言设计的高效IDE

本文还有配套的精品资源,点击获取 简介:Goland是JetBrains公司开发的集成开发环境(IDE),专为Go语言设计,提供了高效的代码编辑、强大的调试工具和丰富的项目管理功能。其智能代码补全、强大的调试与测试支…

uniapp 前端解决精度丢失的问题 (后端返回分布式id)

原因: 后端使用分布式id, id为19位数,导致精度丢失 ,前端解决方法 这个是通过浏览器请求回来的数据,这个时候id 数据已经丢失了,在数据库查询不到,在调获详情接口的时候会有问题 实际的: 解决…

Pandas07

Pandas01 Pandas02 Pandas03 Pandas04 Pandas05 Pandas06 文章目录 1 用户偏好分析 TGI1.1 TGI介绍1.2 TGI案例代码 2 用户评论文本分析2.1 用户评论文本分析简介 1 用户偏好分析 TGI 1.1 TGI介绍 TGI(Target Group Index,目标群体指数)用于…

spring cloud微服务-OpenFeign的使用

OpenFeign的使用 openFeign的作用是服务间的远程调用 ,比如通过OpenFeign可以实现调用远程服务。 已经有了LoadBalancer为什么还要用openFeign? 在微服务架构中,LoadBalancer和OpenFeign虽然都提供了服务间调用的能力,但它们的设计目的和…

使用PHP函数 “setcookie“ 设置cookie

在网站开发中,cookie是一种非常常用的技术,它用于在用户的浏览器中存储少量的数据,以便在不同页面之间传递信息。PHP提供了一个名为 "setcookie" 的函数,用于设置cookie的值和属性。在本文中,我们将学习如何…

读书笔记-《乡下人的悲歌》

前段时间看了一些 J.D. Vance 的采访视频,几乎都是记者带着刁难的问题先手进攻,而 Vance 面带微笑,提及对方的名字,条理清晰地从对方的攻击中切回主题形成后手反制,实在让人看得过瘾。 更不可思议的是,Van…

Datawhale-AI冬令营二期

目录 一、番茄时钟(1)输入Prompt(2)创建 HTML 文件解析1:HTML结构解析2:计时器内容解析3:按钮区域解析4:脚本引用 (3)使用JavaScript实现时钟功能解析1&#…

【Sentinel】流控效果与热点参数限流

目录 1.流控效果 1.1.warm up 2.2.排队等待 1.3.总结 2.热点参数限流 2.1.全局参数限流 2.2.热点参数限流 2.3.案例 1.流控效果 在流控的高级选项中,还有一个流控效果选项: 流控效果是指请求达到流控阈值时应该采取的措施,包括三种&…

我的Qt作品(20)使用Qt+OpenCV写一个旋转/抠图/mask生成工具

使用QtOpenCV写一个旋转/抠图/mask生成工具 1、旋转功能 void FormRotate::rotateImage(const cv::Mat &src, cv::Mat &dst, double degree) //旋转 {if (fabs(degree) < 0.001){dst src;return;}//center旋转的中心点坐标//degree旋转的角度,不是弧度,>0逆时针…

win11中win加方向键失效的原因

1、可能是你把win键锁了&#xff1a; 解决办法&#xff1a;先按Fn键&#xff0c;再按win键 2、可能是可能是 贴靠窗口设置 中将贴靠窗口关闭了&#xff0c;只需要将其打开就好了

MetaRename for Mac,适用于 Mac 的文件批量重命名工具

在处理大量文件时&#xff0c;为每个文件手动重命名既耗时又容易出错。对于摄影师、设计师、开发人员等需要频繁处理和整理文件的专业人士来说&#xff0c;找到一款能够简化这一过程的工具是至关重要的。MetaRename for Mac 就是这样一款旨在提高工作效率的应用程序&#xff0c…

JavaScript甘特图 dhtmlx-gantt

背景 需求是在后台中&#xff0c;需要用甘特图去展示管理任务相关视图&#xff0c;并且不用依赖vue&#xff0c;兼容JavaScript原生开发。最终使用dhtmlx-gantt&#xff0c;一个半开源的库&#xff0c;基础功能免费&#xff0c;更多功能付费。 甘特图需求如图&#xff1a; 调…

VSCode下载安装指南

VSCode下载 通过网盘分享的文件&#xff1a;VSCodeUserSetup-x64-1.96.2.exe 链接: https://pan.baidu.com/s/1l7fdxeALnyeuUe1a5l0aqQ?pwdb8y3 提取码: b8y3 –来自百度网盘超级会员v6的分享 VSCode安装 1、下载好之后双击下图 2、我同意&#xff0c;下一步 3、可以点浏…

多显卡服务器如何设置使用集成显卡输出信号?

要在IPMI中设置服务器的显示接口只使用集成显卡&#xff0c;而不使用插入的PCI显卡&#xff0c;您需要进入服务器的BIOS设置进行相应的配置。以下是一般步骤&#xff1a; • 重启服务器&#xff0c;在启动时按下相应的键&#xff08;通常是Del或F2&#xff09;进入BIOS设置。 …

【黑马头条】day20—xxl-job

目录 1 今日内容 1.1 需求分析 1.2 实现思路 1.3 定时计算 1.4 定时任务框架-xxljob 1.5 学习目录 2.分布式任务调度 2.1 什么是分布式任务调度 2.2 xxl-Job简介 2.3 XXL-Job-环境搭建 2.4 配置部署调度中心-docker安装 2.5 xxl-job入门案例编写 2.6 任务详解-执行…

人工智能基础软件-Jupyter Notebook

简介&#xff1a; Jupyter Notebook是基于网页的用于交互计算的应用程序。其可被应用于全过程计算&#xff1a;开发、文档编写、运行代码和展示结果。 Jupyter Notebook是以网页的形式打开&#xff0c;可以在网页页面中直接编写代码和运行代码&#xff0c;代码的运行结果也会直…

Springboot配置嵌入式服务器

一.如何定制和修改Servlet容器的相关配置 修改和server有关的配置&#xff08;ServerProperties&#xff09;&#xff1b; server.port8081 server.context‐path/tx server.tomcat.uri‐encodingUTF‐8 在yml配置文件的写法&#xff1a; server:port: 8081servlet:context-pa…

Unity功能模块一对话系统(4)实现个性文本标签

本期我们将了解如何在TMPro中自定义我们的标签样式&#xff0c;并实现两种有趣的效果。 一.需求描述 1.定义<float>格式的标签&#xff0c;实现标签处延迟打印功能 2.定义<r" "></r>格式的标签&#xff0c;实现标签区间内文本片段的注释显示功能…

js正则表达式 校验邮箱,非法字符限制输入

Email地址的格式验证规则 JS代码格式&#xff1a; var pattern /\w[-\w.]*([A-Za-z0-9][-A-Za-z0-9]\.)[A-Za-z]{2,14}/; var str "xindd123456163.com"; console.log(pattern.test(str)); Java代码格式&#xff1a; import java.util.regex.Matcher; import…

微信流量主挑战:三天25用户!功能未完善?(新纪元4)

&#x1f389;【小程序上线第三天&#xff01;突破25用户大关&#xff01;】&#x1f389; 嘿&#xff0c;大家好&#xff01;今天是我们小程序上线的第三天&#xff0c;我们的用户量已经突破了25个&#xff01;昨天还是16个&#xff0c;今天一觉醒来竟然有25个&#xff01;这涨…