如何保证分布式事务?

news2024/11/24 14:26:04

📢📢📢📣📣📣

哈喽!大家好,我是【一心同学】,一位上进心十足的【Java领域博主】!😜😜😜

✨【一心同学】的写作风格:喜欢用【通俗易懂】的文笔去讲解每一个知识点,而不喜欢用【高大上】的官方陈述。

✨【一心同学】博客的领域是【面向后端技术】的学习,未来会持续更新更多的【后端技术】以及【学习心得】。

✨如果有对【后端技术】感兴趣的【小可爱】,欢迎关注一心同学】💞💞💞

❤️❤️❤️感谢各位大可爱小可爱!❤️❤️❤️ 


目录

一、分布式介绍

🌴 什么是分布式?

🌴 分布式的好处?

二、分布式事务

🌴 认识分布式事务

🌴 两将军问题

三、解决方案

🌵 两阶段提交(2PC)

🌵 三阶段提交(3PC)

🌵  Seata


一、分布式介绍

🌴 什么是分布式?


分布式很好理解,核心就是一个字——“”,把一个业务拆分成多个子业务,给不同的服务器去处理,这里的服务器可以是单个服务器,也可以是多个服务器集群,一旦处理该业务的服务器出现问题,那么该业务就无法实现了,可以将其理解为一种工作方式。


🌴 分布式的好处?

  • 性能扩展:系统负载高,单台机器无法承载,希望通过使用多台机器来提高系统的负载能力。
  • 模块化:降低耦合度,提高系统模块的重用度。
  • 增强可靠性:如果其中某个节点失效了,则其余的节点可以继续操作,整个系统不会因为一个或少数几个节点的故障而全体崩溃。

二、分布式事务


🌴 认识分布式事务

在分布式场景下,一个系统由多个子系统构成,每一个子系统被称为一个微服务,每个微服务有独立的数据源,以保持独立性。现在有一个电商系统,由购物微服务、库存微服务、订单微服务等组成。

现在用户请求购物微服务下单,那么购物微服务需要做两件事:
第一件事:调用库存微服务扣减相应商品的库存数量。
第二件事:调用订单微服务插入订单记录。


而我们知道一个数据库的本地事务机制只能落到自己身上的CRUD操作上,无法干涉对其他数据库的操作,所以,数据库自身提供的本地事务机制无法确保业务对多数据源全局操作的可靠性,也就是说购物微服务如果第二步操作异常那么该如何保障事务的一致性呢?

故针对多数据源操作提出的分布式事务机制就出现了,分布式事务需要保证这些操作要么全部成功,要么全部失败。本质上来说,分布式事务就是为了保证不同数据库的数据一致性。

🌴 两将军问题

两将军问题:有蓝军和白军,一支白军被围困在一个山谷中,山谷的左右两侧是蓝军。困在山谷中的白军人数多于山谷两侧的任意一支蓝军,而少于两支蓝军的之和。若一支蓝军对白军单独发起进攻,则必败无疑;但若两支蓝军同时发起进攻,则可取胜。两只蓝军的总指挥位于山谷左侧,他希望两支蓝军同时发起进攻,这样就要把命令传到山谷右侧的蓝军,以告知发起进攻的具体时间。假设他们只能派遣士兵穿越白军所在的山谷(唯一的通信信道)来传递消息,那么在穿越山谷时,士兵有可能被俘虏。

左侧蓝军派遣出去送信的士兵没有回来,可能是遇到以下两种情况:
(1)命令还没送达就被俘虏了,这时候右侧蓝军根本不知道要何时进攻;

(2)命令送达,但返回途中被俘虏了,这时候右侧蓝军知道要何时进攻,但左侧蓝军不知道右侧蓝军是否知晓进攻时间。

我们把这个两将军问题放到计算机中,现有发送者给接受者发送一个 HTTP请求,然后超时了没有得到响应,主要有以下情况:
1)可能请求由于网络故障根本没有送到服务器,因此写入失败;

2)可能服务器收到了,也写入成功了,但是向客户端发送响应前服务器宕机了;

3)可能服务器收到了,也写入成功了,也向客户端发送了响应,但是由于网络故障未送到客户端。


三、解决方案


分布式事务模型介绍:

事务参与者:例如每个数据库就是一个事务参与者。

事务协调者:访问多个数据源的服务程序。

资源管理器(Resource Manager, RM):通常与事务参与者同义。

事务管理器(Transaction Manager, TM):通常与事务协调者同义。

在分布式事务模型中,一个 TM 管理多个 RM,即一个服务程序访问多个数据源;TM 是一个全局事务管理器,协调多方本地事务的进度,使其共同提交或回滚,最终达成一种全局的 ACID 特性。

🌵 两阶段提交(2PC)


2PC 是一种实现分布式事务的简单模型,这两个阶段是:

1)投票阶段:
 a、协调者(Coordinator,即事务管理器)会向事务的参与者(Cohort,即本地资源管理器)发起执行操作的 CanCommit 请求,并等待参与者的响应。
b、参与者接收到请求后,会执行请求中的事务操作,记录日志信息(包含事务执行前的镜像),同时锁定当前记录。参与者执行成功,则向协调者发送“Yes”消息,表示同意操作;若不成功,则发送“No”消息,表示终止操作。
c、 当所有参与者都返回了操作结果(Yes 或 No 消息)后,系统进入了提交阶段。

2)提交阶段:
如果各个参与者回复的都是 yes,则协调者所有参与者发起事务提交操作,然后所有参与者收到后各自执行本地事务提交操作并向协调者发送 ACK;如果任何一个参与者回复 no 或者超时,则协调者向所有参与者发起事务回滚操作,然后所有参与者收到后各自执行本地事务回滚操作并向协调者发送 ACK。

 

缺点:
单点故障:一旦协调者出现问题,那么整个第二阶段提交流程将无法运转,更为严重的是,协调者在阶段二中出现问题的话,那么其他的参与者将会处于锁定事务资源的状态中,而无法继续完成事务操作。
数据不一致:在二阶段提交的阶段二中,即提交事务提交的时候,当协调者向参与者发送commit请求之后,发生了局部网络异常或者在发送commit请求过程中协调者发生了故障,这会导致只有一部分参与者接受到了commit请求。而在这部分参与者接到commit请求之后就会执行commit操作。但是其他部分未接到commit请求的机器则无法执行事务提交,从而导致数据不一致。

🌵 三阶段提交(3PC)


改动1:超时机制
在协调者和参与者中引入超时机制。如果协调者或参与者在规定的时间内没有接收到来自其他节点的响应,就会根据当前的状态选择提交或者终止整个事务。
改动2:准备阶段
在第一阶段和第二阶段中间引入了一个准备阶段,也就是在提交阶段之前,加入了一个预提交阶段。保证了在最后提交阶段之前各参与节点的状态是一致的。

🌵  Seata

Seata 为用户提供了 AT、TCC、SAGA 和 XA 事务模式。其中 AT 模式是 Seata 主推的事务模式解决分布式事务问题,Seata有两个设计初衷:
1.对业务无侵入:即减少技术架构上的微服务化所带来的分布式事务问题对业务的侵入
2.高性能:减少分布式事务解决方案所带来的性能消耗
解决分布式事务问题,有两个设计初衷

Seata的AT模式工作流程:

Seata 的 AT 模式建立在关系型数据库的本地事务特性的基础之上,通过数据源代理类拦截并解析数据库执行的 SQL,记录自定义的回滚日志,如需回滚,则重放这些自定义的回滚日志即可。

AT 模式的两个基本阶段是:

1)第一阶段:首先获取本地锁,执行本地事务,业务数据操作和记录回滚日志在同一个本地事务中提交,最后释放本地锁;

基于这样的机制,分支的本地事务便可以在全局事务的第一阶段提交,并马上释放本地事务锁定的资源。

2)第二阶段:如需全局提交,异步删除回滚日志即可,这个过程很快就能完成。如需要回滚,则通过第一阶段的回滚日志进行反向补偿。

小结:
AT 模式第一阶段的流程来看,分支的本地事务在第一阶段提交完成之后,就会释放掉本地事务锁定的本地记录。这是 AT 模式和 XA 最大的不同点,在 XA 事务的两阶段提交中,被锁定的记录直到第二阶段结束才会被释放。所以 AT 模式减少了锁记录的时间,从而提高了分布式事务的处理效率。AT 模式之所以能够实现第一阶段完成就释放被锁定的记录,是因为 Seata 在每个服务的数据库中维护了一张 undo_log 表,其中记录了对 t_order / t_repo 进行操作前后记录的镜像数据,即便第二阶段发生异常,只需回放每个服务的 undo_log 中的相应记录即可实现全局回滚。

undo_log 的表结构:

如果这篇【文章】有帮助到你,希望可以给【一心同学】点个👍,创作不易,相比官方的陈述,我更喜欢用【通俗易懂】的文笔去讲解每一个知识点,如果有对【后端技术】感兴趣的小可爱,也欢迎关注❤️❤️❤️ 【一心同学】❤️❤️❤️,我将会给你带来巨大的【收获与惊喜】💕💕!

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

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

相关文章

Docker: 容器与镜像

文章目录1、docker 环境搭建1.1、docker 安装1.1.1、centos 安装1.1.2、ubuntu 安装1.2、添加到 docker 组1.3、docker 镜像源2、docker 概念2.1、docker 背景2.2、docker 架构2.3、docker 与 vm3、docker 容器隔离4、docker 命令4.1、环境信息4.2、日志信息4.3、容器命令4.4、…

Mac最先进的API工具-RapidAPI for Mac

一、前言 当使用 Mac 进行接口测试的时候,一般都会想到接口测试工具 Postman、Jmeter。 Postman 以其页面友好,功能简单,可以快速上手进行接口测试。而 Jmeter 除了测接口外,还可以进行接口自动化测试、性能测试等。 本篇将介绍…

完整企业官网源码,前端基于Vue+ElementUI,后台基于基于core3 webapi,含数据库文件,含详情安装部署文档

完整企业官网源码,前端基于VueElementUI,后台基于基于core3 webapi,含数据库文件,含详情安装部署文档 完整代码下载地址:完整企业官网源码 某工程管理有限公司企业官网 前端 新版本改进 整体重构,结构…

利用 Flow Simulation 快速和经济高效地解决传热难题

探寻传热问题的有效解决方案已成为新产品研发过程中一个愈来愈重要的部分。几乎一切事物都会经历某种程度的发热或冷却,而且对于许多产品来说,如现代电子设备、医疗设备和空气调节 (HVAC) 系统,热管理已成为避免过度发热和实现功能正常运行的…

Redis实战——附近商家(GEO的使用)

1. 什么是Geo? GEO就是Geolocation的简写形式,代表地理坐标。Redis在3.2版本中加入了对GEO的支持,允许存储地理坐标信息,帮助我们根据经纬度来检索数据。常见的命令有: GEOADD:添加一个地理空间信息&#…

基于WEB多媒体电子贺卡平台

开发工具(eclipse/idea/vscode等): 数据库(sqlite/mysql/sqlserver等): 功能模块(请用文字描述,至少200字): 网站前台:关于我们、联系我们、资讯信息、贺卡类型、贺卡信息、贺卡评论 管理员: 1、管理关于我…

[附源码]Python计算机毕业设计Django校园服装租赁系统

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,我…

毕业设计 单片机墨水屏阅读器(单词卡) - 物联网 嵌入式

文章目录0 前言1 简介2 主要器件3 实现效果4 设计原理部分核心代码5 最后0 前言 🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自…

列表类型(sort,reverse,list(),append(),切片)、求中位数,平均数,标准差练习

映射类型和操作 映射类型是“键-值”数据项的组合,每个元素是一个键 值对,即元素是(key, value),元素之间是无序的。键值对 (key, value)是一种二元关系。在Python中,映射类型主要以字典(dict)体现。 列表类…

模拟大规模电动车充电行为(Matlab实现)

目录 1 模拟大规模充电汽车充电行为 2 Matlab部分代码实现 3 Matlab代码实现 1 模拟大规模充电汽车充电行为 电动汽车EV(Electric Vehicle)具有清洁环保、高效节能的优点,不仅能缓解化石能源危机,而且能够有效地减少温室气体的排放。2015年10月,国务院发布加快E…

设计模式之策略模式

Strategy design pattern 策略模式的概念、策略模式的结构、策略模式的优缺点、策略模式的使用场景、策略模式的实现示例、策略模式的源码分析 1、策略模式的概念 策略模式,即定义一系列算法,并将每个算法封装起来,使它们可以相互替换&#…

Android平台GB28181接入模块技术接入说明

技术背景 今天,我们主要讲讲Android平台GB28181接入模块的技术对接,Android平台GB28181接入模块设计的目的,可实现不具备国标音视频能力的 Android终端,通过平台注册接入到现有的GB/T28181—2016服务,可用于如智能监控…

【Mitigating Voltage Attacks in Multi-Tenant FPGAs 论文笔记】

减轻多租户FPGA中的电压攻击摘要引言内容背景和相关工作INTEL STRATIX 10 FPGA上的PDN攻击Stratix 10 PDN特性定位电压下降片上监控和攻击抑制结论和未来工作结论:未来工作作者:GEORGE PROVELENGIOS, University of Massachusetts Amherst, MA, USADANIE…

Python学习-9.2 程序界面-sys库介绍

可以在Python标准库大全:https://docs.python.org/zh-cn/3/library/index.html中查找sys标准库的解释说明 sys标准库 本章对sys标准库中的重点函数进行讲解,sys库的作用主要是查看python解释器信息及传递信息给python解释器。 sys库的三个重要函数&…

JVM-------栈

栈: 早在数据结构的学习中,我们就知道了栈具有先进先出的特点,而数据结构是程序的一部分,那么栈的特点在java中是如何体现的呢? 比如:main函数先执行而后结束,就是利用了栈的特点。 在java中&#xff0c…

[附源码]计算机毕业设计Node.jsBuff饰品交易平台论文(程序+LW)

项目运行 环境配置: Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术: Express框架 Node.js Vue 等等组成,B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境:最好是Nodejs最新版,我…

2022需求最大的8种编程语言排名

DevJobsScanner分析了过去14个月(从2021 10月到2022年11月)超过1200万开发人员的工作需求,并选择了明确需要编程语言的工作机会,获得了2022年最流行的八种编程语言。 市场上需求最高的前八种语言是: 1、 JavaScript/…

Appium基础 — Appium Inspector定位工具(二)

5、Appium Inspector工具的使用 (1)Inspector 定位控件界面的详细介绍 布局1:截图的手机界面 可以点击选择元素。 布局2:顶部操作栏 从左往右的按钮依次是 Select Element:选择元素。 Swipe By Coordinates&#xff…

json-server

安装node.js https://nodejs.org/zh-cn/download/剩下内容就是next,就默认安装在C盘好了。 WindowR:node -v 下面这种结果代表安装成功 还有 npm -v NPM 是什么 NPM描述 npm(“Node 包管理器”)是 JavaScript 运行时 Node.js 的默认程序包…

redis之数据倾斜如何处理

写在前面 我们在使用Redis分片集群时,集群最好的状态就是每个实例可以处理相同或相近比例的请求,但如果不是这样,则会出现某些实例压力特别大,而某些实例特别空闲的情况发生,本文就一起来看下这种情况是如何发生的以及…