当前位置: 首页 > news >正文

SpringCloud 分布式事务组件之Seata

目录

  • 背景介绍
  • 什么是分布式事务
  • 什么叫做逆向补偿呢
  • 互联网最流行的分布式事务组件seata
  • 总结

背景

大家好,今天给大家分享一个在2022年出去面试Java几乎必问的一个技术,那就是seata。什么??你才看了第一句话心里有闪现了无数个问号?因为没听说过seata这个东西?没关系,为了避免兄弟们出去面试被问到seata的时候,一脸蒙圈,我们今天就把这个东西给大家讲明白。

既然要给大家讲什么是seata,那就得先说一下这个东西的定位,这东西就是现在很火的 spring cloud alibaba里的一个组件,是专门帮助我们解决分布式事务问题的,也就是说,seata是一个分布式事务框架

什么是分布式事务?

那可能很多小伙伴很蒙圈了,什么是分布式事务? 好吧,为了保证大家能继续看下去,我们先说一下什么是分布式事务这个问题。

举个最简单的例子,假设现在你负责了一个订单系统,一个库存系统,一个营销系统,然后呢,当你的订单系统收到用户一个请求要创建订单的时候,这个时候你得做三件事情,第一,调用库存系统的接口锁定库存,第二,调用营销系统的接口锁定优惠券,第三,你订单系统自己得在MySQL里插入一系列订单的数据,比如下图1所示:

图1

那么现在问题来了,你订单系统有自己的订单数据库,可以去插入订单数据,那库存系统是不是也应该有自己的库存数据库,去锁定库存数据?营销系统是不是应该有自己的营销数据库,去锁定优惠券?当然是了!每个人都有自己的数据库,这一个都不能少,如下图2所示:

图2

那现在问题又来了,既然一次创建订单的请求,要涉及到订单、库存、营销三个系统,分别操作各自自己的三个数据库,才能完成这次请求。

那是不是可能会出现这么一种情况,首先呢,你先调用库存系统,锁定了库存了,O了。接着呢,你又调用了营销系统,锁定了优惠券,也O了。最后呢,当你订单系统要往自己的订单数据库里插入数据的时候,网络抽风了,导致你这一次插入订单数据失败了,直接exception异常了,你蒙圈了,如下图3所示:

图3

那这个时候你觉得可能会产生什么样的问题呢,其实很简单,这个时候你这个订单要购买的商品库存已经被锁定了,你为了下这个订单用的优惠券,也已经被锁定了,结果呢,你的订单自己本身的数据并没进入数据库,然后还返回一个了异常信息给用户说,本次下单失败。 但是你说下单失败就失败吧,结果呢,运营看库存数据的时候可能会一脸蒙圈,为啥有一些商品库存被锁定了,结果没有对应的跟订单,而且一直没人付款来购买呢??然后用户自己也有点发蒙,因为一查自己的优惠券,好不容易攒了几张券来买东西,结果现在订单没下成,优惠券状态都搞成已使用了,自己还没法用这些优惠券了,如下图4所示:

图4

其实这就是一个非常经典的分布式事务的问题了,你一个创建订单的请求,横跨了订单、库存、营销三个系统,分别涉及三个数据库,所有很可能会发现,你的库存和营销的数据操作都成功了,而且库存和营销数据库里的本地事务都提交了,结果订单插入数据库失败了,订单数据库里的本地事务回滚了,但是库存和营销数据库里的本地事务已经提交了,他们是不会回滚的,如下图5所示:

图5

什么叫做逆向补偿呢?

那既然问题已经找到了,我们希望的应该是什么效果呢?我们其实希望的效果是,如果订单要是插入数据库失败了,订单数据库本地事务回滚了,我们应该想办法去通知一下库存系统和营销系统,把之前在库存数据库和营销数据库里已经提交的数据修改做一个逆向补偿,进行恢复。

什么叫做逆向补偿呢? 意思就是说,之前库存系统如果在数据库里执行的是insert,那么此时就应该执行delete,把之前插入的数据删除了,如果之前执行的delete,现在就应该执行insert,把删除的额数据重新插入回去,如果之前执行的是udpate语句,现在就应该再次执行一个update语句,把数据恢复到更新之前的状态,如下图6所示:

图6

互联网最流行的分布式事务组件seata

那既然我们想要实现这个效果,这个时候问题就来了,单单依赖我们自己那肯定搞不定这个问题了,这个时候就必须引入spring cloud alibaba里的大佬组件,seata。seata就是专门帮助我们解决这个问题的,如果我们要是在系统里引入seata框架之后,其实每个系统里都会嵌入seata,同时我们还需要去部署一个seata server,如下图7所示:

图7

这个时候,我们的系统运行原理会变成这样,订单系统中的seata会发送请求给seata server去开启一个全局事务,然后库存系统先运行,他在进行数据库crud的时候,这些操作都会被seata框架进行拦截,然后seata框架会在一个本地事务里,把你的sql语句和逆向补偿日志,一起插入到你的库存数据库里去,在库存数据库里必须有一个undo_log表,存储seata的逆向补偿日志

那这个逆向补偿日志是什么呢?简单,如果你的sql是insert,那逆向补偿日志可以帮助你后续构建delete语句来删除,如果你的sql是update,那逆向补偿日志可以记录你更新之前的旧数据,他可以帮助你后续把数据update到老版本的状态,如下图8所示:

图8

你库存系统的sql语句和他们的补偿日志,是在一个本地事务里一起提交的,一起成功或者一起失败,所以但凡你的库存系统更新成功了,就一定会有对应的补偿日志也会在库存数据库里的,以备不时之需,营销系统其实也是相同的运行原理。

那么假设说库存系统和营销系统,按照这个思路都执行完毕了,到订单系统了,他结果撂挑子了,插入订单数据库失败,当然,在插入的时候其实也会有对应的补偿日志会一起提交,但是因为这个时候网络问题,导致插入订单和插入补偿日志一起失败了,所以此时订单系统的seata就会上报seata server说,大哥,我这儿完犊子了,您要不通知库存和营销两个兄弟,逆向补偿一下吧,如下图9所示:

图9

接着seata server发现说,这分布式事务都失败了,那赶紧的,他会通知库存系统和营销系统里的seata框架小兄弟说,兄弟们,赶紧的,把之前插入你们数据库里的undo_log表里的补偿日志拿出来,构建一下逆向补偿sql,之前是insert你就给我弄个delete,之前是delete你就给我弄个insert,之前是update你还是update,逆向补偿sql赶紧跑一把,把数据给我恢复了,前队改后队,跑步前进,hurry up起来,如下图10所示:

图10

总结

相关文章:

SpringCloud 分布式事务组件之Seata

目录 背景介绍什么是分布式事务什么叫做逆向补偿呢互联网最流行的分布式事务组件seata总结 背景 大家好,今天给大家分享一个在2022年出去面试Java几乎必问的一个技术,那就是seata。什么??你才看了第一句话心里有闪现了无数个问…...

@TransactionalEventListener的使用和实现原理

一、问题描述 平时我们在完成某些数据的入库后,发布了一个事件,此时使用的是EventListener,然后在这个事件中,又去对刚才入库的数据进行查询,从而完成后续的操作。例如(数据入库>对入库数据进行查询审核…...

没计算机基础,就是评职称用的,软考中级哪个好考啊?

那必须把系统集成项目管理工程师安排上! 题目也不难,主要弄清楚47个过程的输入输出,还有工具的使用,几乎很多题都是按照这逻辑来的。 建议可以去网上、刷题APP上,多薅点资料和真题,集成是热门科目&#x…...

数字化战略,如何解读企业财务报表

01 财务数字化管理 第一,财务基本信息化建设。比如财务系统、财务共享中心等通过数字化的手段提升财务会计核算、财务流程管理效率,解决流程性管理的问题。 第二,利用各类商业智能 BI 分析、数据分析的手段把企业的所有行为都进行量化对比&…...

JAVA14新特性

JAVA14新特性 概述 Oracle在2020年3月17日宣布JAVA14 全面上市,JAVA14通过每六个个月发布一次新功能,为企业和开发人员社区提供增强功能,继续了Oracle加快创新的承诺. 最新的JAVA开发工具包提供了新功能,其中包括两项备受期待的新预览功能,实例匹配的匹配模式(JEP 305) 和记录…...

Google SEO优化的10大误区

以下是 Google SEO 优化的十大误区: 1、关键词堆砌: 过度使用关键词,使得内容不自然,难以阅读,同时也会被搜索引擎认为是垃圾信息,影响网站排名。 2、内容质量差: 质量差的内容会降低用户的体…...

.netCHARTING 10.5 dotnetcharting Crack

.net图表 10.5 为柱形图和条形图添加拐角半径控件。 5月 05, 2023 - 16:18新版本 特征 直角或直线组织连接线 - 默认情况下,通过以直角绘制组织连接线来增强组织连接线的显示方式。您可以使用直线选项更改此默认值,并直接在点…...

单元,集成,系统,验收,回归测试

测试流程 单元测试—集成测试–系统测试—验收测试 单元测试 通常由程序员自己来进行单元测试。程序员编写代码后,应该先自行进行单元测试,验证代码的正确性和质量。单元测试可以通过手动测试或自动化测试工具进行。 集成测试 集成测试:集成…...

云计算适合大专生学吗?

云计算适合大专生学吗? 对于大专毕业生来说,云计算的确是一个不错的选择,因为云计算技术应用专业,主要就是专科院校在办学。不管你是计算机相关专业的,还是零基础想学习都是可以的;原因就在于云计算这门专业…...

【系统集成项目管理工程师】项目风险管理

💥十大知识领域:项目风险管理 项目风险管理包括以下 6 个过程: 规划风险管理识别风险实施定性风险分析实施定量风险分析规划风险应对控制风险 一、规划风险管理 定义如何实施项目风险管理活动的过程 输入工具与技术输出项目管理计划项目章程干系人登记册…...

Quartz2D之Path使用初步

我们直接看以下代码: // // MyQuartzView.m // QuartzTest // // Created by zenny_chen on 12-2-21. // Copyright (c) 2012年 GreenGames Studio. All rights reserved. //#import "MyQuartzView.h"// Quartz2D以及Core Animation所需要的头文件 #…...

Adobe考试

Adobe考试又称为Adobe国际认证和Adobe认证考试,Adobe国际认证(英文:Adobe Certified Professional)是Adobe公司CEO签发的权威国际认证体系,旨在为用户提供Adobe软件的专业认证。 Adobe考试覆盖了各种Adobe软件,包括Photoshop、Illustrator、InDesign、P…...

三线城市程序员的薪资待遇怎么样?我分享提高java技术水平的几个方法

今天想和大家聊聊在三线城市,程序员的薪资待遇水平到底是怎样的。随着科技行业的迅速发展,IT行业成为了当今越来越受欢迎的行业之一。在过去的几年里,IT行业中需求最大的工作是与开发相关的工作,比如java,包括前端和手…...

马哈鱼SQLFLow对SQL Server OUTPUT Clause 的数据血缘分析

SQL Server OUTPUT Clause 会对 SQL 语句的血缘分析产生影响,如果忽略对 OUTPUT Clause 的分析,那么将漏掉一些关键的数据血缘关系,从而影响数据血缘分析的准确性,进而影响组织的数据治理质量。 Gudu SQLFlow 可以对 SQL Server …...

5/8~5/9总结

JavaFX中的ListView是一个可滚动的列表控件,它可以用来显示一组数据。下面是ListView的详细使用步骤: 1. 导入JavaFX相关类库 java import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.scene.control…...

java 数组创建的方法

数组是一个由一组元素组成的集合,我们可以用一个数组来表示集合。 java中最基本的数据类型是字符串,其长度是固定的,且不可变,一个字符串只能以一个数字开头。 在 Java中我们可以通过 myConst关键字来指定数组的长度。下面就看一下…...

HID Relay, 有线键盘转蓝牙项目学习:记一次失败的尝试

HID Relay, 有线键盘转蓝牙项目学习:记一次失败的尝试 开始学习嵌入式后,最难受的一个点在于电脑端口不够。我的电脑有两个USB口一个TypeC口,鼠标和键盘都要插USB口,stm32和51也都要插USB口。 那么烧录的时候,要么就…...

天猫数据分析:2023年Q1天猫净水器品牌销售TOP10排行榜

水质的好坏更是与人们的身体健康密切相关。随着社会经济的发展,居民生活水平提升,人们对饮用水质量、安全性的要求也不断提高,净水器也因此逐渐成为现代生活的必需品。 根据鲸参谋电商数据显示,2023年Q1在天猫平台上,净…...

TweenMax 源码阅读

GSAP 之 TweenMax 源码阅读(一) 一、背景 GreenSock (绿袜子) GreenSock 是一家做 专业级 JavaScript 动画的公司,主要产品就是其下的 GSAP (GreenSock Animation Platform),配合着 GSPA 开发了很多专业的…...

B/S医院手术麻醉管理系统源码:麻醉知情同意书模板

麻醉知情同意书模板 姓名:​ 性别:​ 年龄:​ 科别:​ 床号:​ 住院号:​ 疾病介绍和治疗建议: 医生已告知我因​手术,而接受麻醉。 1.麻醉作用的产生主要是利用麻醉药使中枢神经系统或神经中某些部位受到抑制的结果,临床麻醉的主要任务是: 2.为…...

CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型

CVPR 2025 | MIMO:支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题:MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者:Yanyuan Chen, Dexuan Xu, Yu Hu…...

Day131 | 灵神 | 回溯算法 | 子集型 子集

Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...

ssc377d修改flash分区大小

1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...

使用分级同态加密防御梯度泄漏

抽象 联邦学习 (FL) 支持跨分布式客户端进行协作模型训练,而无需共享原始数据,这使其成为在互联和自动驾驶汽车 (CAV) 等领域保护隐私的机器学习的一种很有前途的方法。然而,最近的研究表明&…...

生成 Git SSH 证书

🔑 1. ​​生成 SSH 密钥对​​ 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" ​​参数说明​​: -t rsa&#x…...

Neo4j 集群管理:原理、技术与最佳实践深度解析

Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...

【单片机期末】单片机系统设计

主要内容:系统状态机,系统时基,系统需求分析,系统构建,系统状态流图 一、题目要求 二、绘制系统状态流图 题目:根据上述描述绘制系统状态流图,注明状态转移条件及方向。 三、利用定时器产生时…...

【Java_EE】Spring MVC

目录 Spring Web MVC ​编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 ​编辑参数重命名 RequestParam ​编辑​编辑传递集合 RequestParam 传递JSON数据 ​编辑RequestBody ​…...

让AI看见世界:MCP协议与服务器的工作原理

让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...

稳定币的深度剖析与展望

一、引言 在当今数字化浪潮席卷全球的时代,加密货币作为一种新兴的金融现象,正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而,加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下,稳定…...