当前位置: 首页 > 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.为…...

postman 的 console 窗口,助力 http 请求错误时的问题排查

postman 是个很不错的 http 请求测试工具,有时我们使用它发送 http 请求,但是因为各种原因,导致请求失败,没有 response 返回,可能只有一个状态码,这让我们排查起来非常困难,比如下图所示&#…...

破事精英2◎爬向未来

胡强的2033未免有些过去可怕,海星果然又是反派。 只剩“脑子”的胡强 400百斤只剩“嘴”的庞小白 将自己身体分成一个个“方块”的苏克杰 苍蝇满天飞“衣服堆”的金若愚 “脑子”送到月球打两份工的沙乐乐 有机器人或者分身帮我们干活赚钱,我们去吃喝玩…...

java中session各种使用场景实例,这篇文章就够了。

目录 java原生使用Session详解什么是SessionSession的使用Session的配置Session的安全性总结 SpringCloud中使用session详解1. 添加依赖2. 配置Redis3. 配置Session4. 使用Session5. Session超时时间6. Session共享7. Session序列化8. 总结 Spring Boot中Session使用详解Spring…...

【AWS入门】利用CloudWatch监控EC2的CPU负载情况

创建一个 EC2 实例 User data 配置如下 #!/bin/bash sudo -i amazon-linux-extras install epel -y yum install stress -y导航到 Cloudwatch->Metrics->All metrics-EC2->Per-Instance Metrics,选中创建的 EC2的 CPU 利用率,点击铃铛标识创建 alarm 设…...

如何使用AndroidStudio编写Java程序

文章目录 使用场景使用方法整体的思路具体的步骤经验总结使用场景 在开发Android项目中有时候需要写一些Java程序做示例或者验证,这里说的Java程序是指Java控制台程序,程序中带有独立的main()方法。如果把Java示例程序放到Android项目中那么需要运行整个项目才能编译Java示例…...

如何充分利用实时聊天系统?

随着商业和电子商务领域经历快速的数字革命,必须迅速适应的一个因素是我们与客户的互动方式。几年前,电子邮件和电话还是主要的客户联系方式。如今,客户期望更好的服务和更即时的沟通。实时聊天支持系统可以解决此问题,如SaleSmar…...

[C++基础]-类和对象(下)

前言 作者:小蜗牛向前冲 名言:我可以接受失败,但我不能接受放弃 如果觉的博主的文章还不错的话,还请点赞,收藏,关注👀支持博主。如果发现有问题的地方欢迎❀大家在评论区指正。 目录 一、深入学…...

NP完全性PART1:多项式时间与形式化语言体系

算法导论第三版,CH34笔记 NP完全性 Chapter Introduction 一般来说,我们认为可以在多项式时间内求解的问题是易处理的问题,在超多项式时间内解决的问题是不易处理的问题。 下面列出的几对问题,前者可以用多项式时间算法求解&…...

685页40万字某省市场监管智慧应用一体化项目(word可编辑)

1.2.3.1 数字XX公共能力建设现状 1.2.3.1.1 数字XX通用基础应用平台现状 通用基础应用平台提供具有共性特征的跨部门、跨层级业务应用,与本项目有关的平台包括某省网上办事大厅、某省政务服务 APP 统一平台(X政通 APP)、某省公共信用信息平…...

【cutlass】cuTe 01 layout

简介 Layout将坐标映射到地址空间,其对阵列单元在内存中如何排布进行抽象,并提供了获取多维阵列的接口。用户可以以正常的方式(不需要做复杂的地址计算)写多维阵列存取代码,对于存取的不同方式可以改变Layout来实现&a…...