分布式事务-SpringBoot集成Seata

1.本地事务和分布式事务概念

事务四大特性

  • 原子性:事务不可再分
  • 一致性:数据改变前后,总量必须一致
  • 隔离性:事务之间相互隔离,互不干扰
  • 持久性:事务一旦提交,数据就会持久化到磁盘,不能回滚

本地事务:所有的事务都是基于数据库的,那么我们在代码中加@Transactional其实是使用的数据库的Begin/Commit/Rollback,底层使用的是动态代理。本地事务只能管理到当前服务连接的那个数据库的事务,如果一个事务中操作了多个数据库在回顾的时候只能回滚当前服务连接的那个数据库,没办法回滚其它数据库

分布式事务:用于解决在一个方法中操作多个数据库的事务,分布式事务其实就是将多个数据库加入到同一组事务中,当某一个数据库发生异常时整体回滚

2.分布式事务的解决方案

2.1 XA协议

  • 简单理解就是XA规范协议是一种事务协议,通过这种协议来通知数据库事务的开始、结束、提交、以及回滚,XA 接口函数由数据库厂商提供。XA协议使用二阶段提交来处理分布式事务,说的更明白一点就是XA协议保证了分布式事务的原子性,要么都成功,要么都失败。
  • XA协议采用两阶段提交方式来管理分布式事务

2.2 2PC模式

2PC就是基于XA协议进行实现的,采用两阶段提交 2PC(Two Phase Commitment Protocol)来管理分布式事务,所谓二阶段是有两个阶段组成,一阶段投票阶段和二阶段提交阶段。同时它是由“事务协调器”和若干“事务执行者”两个角色组成。

第一阶段:准备阶段( 投票阶段 )

  1. 事务协调器向所有事务参与者发请求,询问是否可以执行提交操作(你们都可以执行事务操作吗?),并开始等待各参与者节点的响应。
  2. 事务参与者收到协调者的指令开始执行事务操作但是不会提交事务,同时写Undo log(写操作之前首先将数据备份log,如果要回滚就从这个log进行数据还原) 和 Redo log(修改数据在buffer pool缓冲池中修改,Redo log是对这个缓冲池的内容做持久,避免修改的数据丢失) 。
  3. 如果参与者事务操作都执行成功(注意哦,没提交事务哦),那么就会回复 事务协调器 “准备OK” ,如果事务操作失败,那么就会回复执行者“准备不OK”。

第二阶段:提交阶段

正常流程

  1. 事务协调器会收到参与者的回复,如果所有的参与者都回复“准备ok”,意味着所有的参与者都可以完成事务操作,那么事务协调器会向每个事务参与者发送一个“commit” 提交事务指令(既然大家都可以进行事务操作,那大家都提交事务把)
  2. 事务参与者收到指令就开始提交事务,然后会向事务协调器回复“完成”,事务协调器收到所有参与者都回复完成,事务完成

回滚流程

  1. 如果再第一阶段事务协调器收到了某个事务参与者回复“准备不ok”即事务操作执行失败,那么事务协调器会向所有的事务参与者发送“rollback”回滚执行(有一个成员不ok,那大家都散了吧,今天的事情搞不成了)
  2. 事务参与者收到指令,回滚之前的事务操作,即:将数据还原到“Undo log”的数据,然后向事务协调者回复“回滚成功”,当事务协调器收到所有的参与者回复“回滚成功”后,取消事务。

发送回滚指令

二阶段提交的问题

  • 二阶段能保证分布式事务的原子性,但是也有一些明显的缺陷。比如:在第一阶段,如果参与者迟迟不回复协调者,就会造成事务的阻塞,性能不好。
  • 单节点故障,如果协调器挂了,参与者会阻塞,比如在第二阶段,如果事务协调器宕机,参与者没办法回复信息,长时间处于事务资源锁定,造成阻塞(事务操作是要加锁的)。
  • 在第二阶段,如果在事务协调器发出"commit"执行后宕机,一部和参与者收到了消息提交了事务,而一部分没有消息没法做出事务提交操作,这样就出现了数据不一致。
  • 在第二阶段,如果事务事务协调器发出“commit”指令后宕机,收到“commmit”指令的参与者也宕机了,那么事务最终变成了什么效果,提交了还是没提交?没有谁知道。

2.3 3PC模式

三阶段提交(Three-phase commit),也叫三阶段提交协议(Three-phase commit protocol),是二阶段提交(2PC)的改进版本,

3PC在2PC的功能上做了两个改动,一是在协调者和事务参与者之间引入了超时机制,在第一阶段和第二阶段中插入一个准备阶段 , 保证了在最后提交阶段之前各参与节点的状态是一致的,那么现在的三阶段分为了:

  1. canCommit“询问是否能提交,
  2. papreCommit”准备提交阶段 ,
  3. doCommit”提交阶段。

第一阶段“canCommit” :

  1. 事务协调者向事务参与者发送 canCommit 请求询问是否能提交事务,然后等待所有事务参与者的返回
  2. 事务参与者接收到事务些调整的canCommit指令,然后自身认为能够提交事务则返回 “yes”否则返回“no”

第二阶段“papreCommit”

事务协调者收到所有的事务参与者的canCmmit指令的反馈结果,这里有两种情况,一是所有的反馈都是yes,二是有部分的事 务参与者返回No,后者反馈超时。

正常流程

  1. 如果事务协调者收到所有的事务参与者的canCmmit指令反馈结果都为YES,那么就进入papreCommit阶段。事务协调者向事务参与者发送 “papreCommit”指令。
  2. 事务参与者收到“papreCommit”指令,开始进行事务操作,并将undo和redo信息记录到事务日志中,如果顺利执行事务操作,则反馈ACK确认信息,然后等待下一步指令。

中断事务

  1. 如果事务协调者收到所有的事务参与者的canCmmit指令反馈结果出现了NO,或者等待超时,那么就执行事务中断,向所有的事务参与者发送“abort”中断指令。
  2. 事务参与者接收到“abort”指令,中断事务,当然如果事务参与者迟迟未收到事务协调者的指令等待超时也会中断事务。

第三阶段“doCommit阶段”

这里准备提交事务了,这里有两种情况,如果事务协调者收到所有的事务参与者的papreCommit指令反馈结果都是ACK,那么进入doCommit阶段,否则会中断事务。

正常流程

  1. 事务协调者收到所有的事务参与者的papreCommit指令反馈结果都是ACK,然后向事务参与者发送“doCommit”指令,通知提交事务。
  2. 事务参与者收到“doCommit”指令,正式执行事务提交,并且释放所有事务资源,返回向事务协调者返回事务结果状态“ACK”完成
  3. 事务协调者收到所有的事务参与者都返回ACK成功,完成事务。

中断事务

  1. 事务协调者收到的事务参与者的papreCommit指令反馈结果有的不是ACK,那么事务协调者然后向事务参与者发送“abort”事务中断指密令。
  2. 事务参与者收到“abort”事务指令,会根据unlog日志文件还原数据,然后释放事务资源,然后向事务协调者发送回滚“ACK”消息
  3. 事务协调者收到所有的事务参与者都返回ACK消息,取消事务。

2.4 TCC事物补偿

TCC(Try Confirm Cancel) 事务补偿机制,即每一个操作都要做相应的补偿机制,即如何确认操作成功,如果操作失败如何撤销事务。它分为三个阶段

  1. Try : try的意思是尝试,其实这个步骤是用来做业务的预处理,可以理解为是做一些准备工作,等到Confirm之后这些操作才算成功。
  2. Confirm :确认,如果所有的事务参与者都try成功,执行commit对业务做提交操作,或者可以理解成对try的工作作出确认。
  3. Cancel:取消,如果try失败需要回滚,即取消try的预处理操作

2.5 MQ消息最终一致性

大致流程是:

1.主业务方向发送一个“Prepared”准备消息到MQ,这个消息还未被确认,不会发生给消费者,然后MQ向生产者发送确认收到消息,然后主业务方执行自己的业务,并提交本地事务,成功后向MQ确认之前的“Prepared”消息发生给消费者,如果失败MQ将当前半消息删除,取消事务。

2.消息接受者方收到消息后执行业务逻辑,提交本地事务,然后向MQ返回ACK确认消息,如果ACK消息为成功,MQ则删除当前消息;如果消费者消息接受失败或返回ACK是失败,会进行重试,保证消息最终被消费。直到16次后还是失败,消息会进入死信队列,该消息不会被删除,也不会重发,需要人工介入;

RocketMQ的事务消息:使用MQ的分布式事务是最终一致性

  1. 生成者发送一个半事务消息给MQ,MQ告诉生产者接收到了,此时生产者方就去执行本地事务
  2. 如果执行成功那么告诉MQ执行Commit,如果本地事务失败MQ执行Rollback。那么MQ执行Commit就是把此消息发送给消费者,消费者接收到消息之后执行本地事务,如果执行成功那么响应ACK确认成功,如果执行失败那么响应ACK失败,MQ接收到成功删除此消息,如果失败那么会再次发送,直到16次之后还是失败那么进入到死信队列,此时就需要我们人工去检查代码手动发送消息再次消费。如果MQ执行Rollback那么就会把此消息进行删除。
  3. 如果避免生产者一直不提交commit或rollback还准备了一个回查机制,调用我们写的一个方法,在方法中去检查生产者的本地事务是否执行成功,如果成功提交commit,如果失败提交rollback

2.6 Seata框架

seata(Simple Extensible Autonomous Transaction Architecture) 是 阿里巴巴开源的分布式事务中间件,致力于提供高性能,零入侵和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。

Seata 的设计思路是将一个分布式事务可以理解成一个全局事务,下面挂了若干个分支事务,而一个分支事务是一个满足 ACID 的本地事务,因此我们可以操作分布式事务像操作本地事务一样。

Seata重要组成

  • Transcation ID(XID) : 由事务协调者创建的全局唯一的事务ID
  • Transaction Coordinator(TC) - 事务协调器:一个独立运行的组件,负责维护全局事务的运行状态,负责根据TM的指令协调并驱动全局事务的提交或回滚,负责向资源管理器发起事务提交,回滚指令。
  • Transaction Manager - 事务管理器 :控制全局事务的边界,负责开启一个全局事务,并最终发起全局提交或全局回滚的决议,通知TC提交或者回滚事务。
  • Resource Manager(RM) - 资源管理器: 控制分支事务,负责分支事务注册、负责向TC汇报分支事务状态,并接收事务协调器的指令,驱动分支(本地)事务的提交和回滚

正常执行流程:

  1. 系统启动TM事务管理者以及RM资源管理者需要向事务协调器进行提交注册,可以看做是一种初始化。
  2. 在Bussiness的业务主方法上我们需要打上@GlobalTransationl注解,通过这个注解,事务管理器TM向事务协调者(TC)申请开启一个全局分布式事务,事务协调者创建全局事务后返回全局唯一的 XID,这个XID 会在涉及微服务的整个全局事务的上下文中进行传播。
  3. 业务开始,Bussiness通过Feign调用Order,并传递全局事务XID,Order在做写操作的时候,RM资源管理器 (Order集成了RM)向事务 协调器TC 注册本地分支事务,该分支事务归属于拥有相同 XID 的全局事务,同时事务协调者TC会返回一个分支事务ID:“branchId” 。说明一下:Seate通过代理DataSource向TC发起分子事务注册的。
  4. 这个时候Order会正常的写数据库,然后会写入一个undo log(这个日志文件记录了数据库修改前的数据,用来做回滚),然后提交分支事务(注意,分支事务已经提交了) , 最后向TC上报事务处理状态。当然Account做的事情和Order是相同的。
  5. Order和Account都调用完成,代码回到Business,这时TM事务管理器向TC事务协调者发起全局事务提交请求,TC向RM事务分支发起事务提交请求,RM(Order, Account)直接删除到undo log日志文件即可,因为之前已经提交了本地事务

异常执行流程:

前面2个步骤都跟上面一样,这里省略 , 在第 3 步的时候,Order在可能因为某种原因本地分支事务提交失败了,那么RM会向TC上报一个失败的事务状态

在第 4 步 ,这个时候代码回到Business,这时TM事务管理器会向TC事务协调者发起全局事务回滚请求,TC向RM事务分支发起事务回滚请求,RM(Order, Account)收到回滚指令,然后会解析undo log,指向反向操作,把数据还原到修改之前,删除undo log,提交本地事务。

3.微服务整合seata

3.1导入依赖
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-seata</artifactId>
</dependency>
3.2yaml配置seata

项目的yaml中对seata做配置

  • 这里的tx-service-group: ${spring.application.name}-tx-group要和seataServer.properties中的保持一致
seata:enabled: trueapplication-id: ${spring.application.name}tx-service-group: ${spring.application.name}-tx-group #it-fccar-service-driver-tx-group#对应seataServer.properties中的service.vgroupMapping.it-drive-service-driver-tx-group=defaultconfig:type: nacosnacos:server-addr: ${NACOS_HOST:8.137.85.173:8848}:${NACOS_PORT:8848}username: nacospassword: nacos #账号再nacos管理界面配置namespace: fccar-dev #取pom.xml中的命名空间data-id: seataServer.propertiesgroup: DEFAULT_GROUP #重要,和seataServer.properties保持一样registry:type: nacosnacos:application: service-seata #seata的服务名server-addr: ${NACOS_HOST:8.137.85.173:8848}:${NACOS_PORT:8848}username: nacospassword: nacos #账号再nacos管理界面配置namespace: fccar-dev #取pom.xml中的命名空间group: DEFAULT_GROUPenable-auto-data-source-proxy: true #开启seata的datasource自动代理

在启动类贴注解开启seata , 因为yaml做了配置,下面注解可以不要

@EnableAutoDataSourceProxy(dataSourceProxyMode="AT",useJdkProxy=false)
3.3.开启全局事务

开启全局事务,在入口方法贴注解

  • 注意:只在业务入口的微服务的方法上贴即可
@GlobalTransactional(name = "driver-wechat-register",rollbackFor = Exception.class)

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

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

相关文章

深入探讨钉钉与金蝶云星空的数据集成技术

钉钉报销数据集成到金蝶云星空的技术案例分享 在企业日常运营中&#xff0c;行政报销流程的高效管理至关重要。为了实现这一目标&#xff0c;我们采用了轻易云数据集成平台&#xff0c;将钉钉的行政报销数据无缝对接到金蝶云星空的付款单系统。本次案例将重点介绍如何通过API接…

【MATLAB源码-第200期】基于matlab的鸡群优化算法(CSO)机器人栅格路径规划,输出做短路径图和适应度曲线。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 鸡群优化算法&#xff08;Chicken Swarm Optimization&#xff0c;简称CSO&#xff09;是一种启发式搜索算法&#xff0c;它的设计灵感来源于鸡群的社会行为。这种算法由Xian-bing Meng等人于2014年提出&#xff0c;旨在解决…

优阅达携手 Aiven 亮相新加坡科技周,推动企业多云数据管理与开源技术创新

助力企业在任何云上提高数据管理效率&#xff0c;开发个性化的创新技术解决方案。 10 月中旬&#xff0c; 2024 年新加坡科技周在 Marina Bay Sands 盛大举行&#xff0c;吸引了超过 25,000 名科技领袖、500 多家参展商和 600 多位演讲者&#xff0c;共同展示了全球前沿的技术…

【AIGC】国内AI工具复现GPTs效果详解

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AIGC | GPTs应用实例 文章目录 &#x1f4af;前言&#x1f4af;本文所要复现的GPTs介绍&#x1f4af;GPTs指令作为提示词在ChatGPT实现类似效果&#x1f4af;国内AI工具复现GPTs效果可能出现的问题解决方法解决后的效果 &#x1…

Unreal5从入门到精通之如何在指定的显示器上运行UE程序

前言 我们有一个设备,是一个带双显示器的机柜,主显示器是一个小竖屏,可以触屏操作,大显示器是一个普通的横屏显示器。我们用这个机柜的原因就是可以摆脱鼠标和键盘,直接使用触屏操作,又可以在大屏观看,非常适合用于教学。 然后我们为这款机柜做了很多个VR项目,包括Uni…

解决linux mint22安装VMware虚拟机报错

涉及版本范围 linux内核6.8x-6.9.x vmware版本17.5.2 解决办法 wget https://github.com/nan0desu/vmware-host-modules/archive/refs/heads/tmp/workstation-17.5.2-k6.9.1.zip unzip workstation-17.5.2-k6.9.1.zip cd vmware-host-modules-tmp-workstation-17.5.2-k6.9.1…

vue echarts左右间距调整 左右空白

咱就说这样的左右间距丑不丑。。 经过调整后&#xff0c;嗯&#xff0c;好看了很多。页面也协调多了&#xff01; 直接上代码&#xff1a;添加以下配置数据&#xff1a; grid: {x: 50,y: 25,x2: 30,y2: 35 }, this.chart.setOption({width: 100%,xAxis: {show: false,type: ca…

基于梧桐数据库的实时数据分析解决方案

一、背景 在当今信息时代&#xff0c;数据的价值不言而喻。然而&#xff0c;处理海量数据并将其转化为有意义的洞察力是一项艰巨的任务。传统的数据处理方法已经无法满足我们日益增长的需求。为了满足这一挑战&#xff0c;实时数据处理系统应运而生。 ​ 实时数据处理系统是一…

一个git相关的cve:CVE-2024-32002

最近听说一个与自己相关的CVE, CVE-2024-32002 文章目录 前言Description二、PATCH总结 前言 cve git windows hook submodule 利用submodule和hook&#xff0c;实现对.git目录注入hook的目标。 影响windows和mac os下的大部分git版本。 提示&#xff1a;以下是本篇文章正文内…

电商API:开启电商新时代的关键钥匙

一、电商API&#xff1a;定义与发展 电商API&#xff0c;即应用程序编程接口&#xff0c;是连接不同软件系统的桥梁&#xff0c;在电商领域中发挥着至关重要的作用。电商API的发展历程可以追溯到20世纪90年代&#xff0c;当时电子商务刚刚兴起&#xff0c;企业开始意识到通过A…

科技成果跃然“屏”上,虚拟展厅引领科技展示新风尚

一、沉浸式互动体验增强吸引力 虚拟科技展厅利用虚拟现实等先进技术&#xff0c;为科技成果打造了一个沉浸式的展示空间。用户可以通过手机、平板、电脑等设备&#xff0c;身临其境地浏览科技成果&#xff0c;感受其独特魅力。与传统的线下展厅相比&#xff0c;虚拟展厅不受物…

Linux学习笔记

九月二十六号: 三种网络连接的区别: 克隆的虚拟机文件可以放在另一台电脑上一样使用 LINUX目录结构: 查看linux IP地址的指令: ifconfig 查看ens33对应的 通过Xshell输入reboot会使linux重启 vim使用: 关机&重启命令&用户登录和注销: 用户管理: pwd: 显示当前在哪个…

数字信号处理-FPGA插入不同误码率的模拟源

module data_error_injector (input clk, // 时钟信号&#xff0c;50MHzinput reset, // 复位信号&#xff0c;高有效input DIN_EN, // 数据输入使能&#xff0c;高有效input [7:0] ERROR_LEVEL, // 错误等级…

华为OD机试 - 学生排名(Java 2024 E卷 100分)

华为OD机试 2024E卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;E卷D卷A卷B卷C卷&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;私信哪吒&#xff0c;备注华为OD&#xff0c;加…

快速学习Django框架以开发Web API

简介 Django是一个高级Python Web框架,它鼓励快速开发和简洁实用的设计。由经验丰富的开发者构建,Django可以为你处理大量的Web开发任务,使你能够专注于编写应用的关键组件。Django的模块化设计、可复用性和广泛的社区支持,使其成为开发Web应用和API的理想选择。 在本文中…

真·香!深度体验 zCloud 数据库云管平台 -- DBA日常管理篇

点击蓝字 关注我们 zCloud 作为一款业界领先的数据库云管平台&#xff0c;通过云化自治的部署能力、智能巡检和诊断能力、知识即代码的沉淀能力&#xff0c;为DBA的日常管理工作带来了革新式的简化与优化。经过一周的深度体验&#xff0c;今天笔者与您深入探讨 zCloud 在数据库…

探索PickleDB:Python中的轻量级数据存储利器

文章目录 探索PickleDB&#xff1a;Python中的轻量级数据存储利器1. 背景&#xff1a;为什么选择PickleDB&#xff1f;2. PickleDB是什么&#xff1f;3. 如何安装PickleDB&#xff1f;4. 简单的库函数使用方法创建和打开数据库设置数据获取数据删除数据保存数据库 5. 应用场景与…

PPT文件设置了修改权限,如何取消权?

不知道大家在使用PPT文件的时候&#xff0c;是否遇到过下面的提示框&#xff0c;这就是PPT文件设置了修改权限&#xff0c;只有输入密码才可以编辑文件。 如果我们没有输入密码&#xff0c;以只读方式进入&#xff0c;那么我们会发现功能栏中的按钮全是灰色&#xff0c;无法使用…

【测试工具篇一】全网最强保姆级教程抓包工具Fiddler(2)

本文接上篇Fiddler介绍&#xff0c;开始讲fiddler如何使用之前&#xff0c;给大家讲讲http以及web方面的小知识&#xff0c;方便大家后面更好得理解fiddler使用。 目录 一、软件体系结构---B/S与C/S架构 B/S架构 C/S架构 二、HTTP基础知识 什么是http请求和响应? http协…

健身房管理新纪元:SpringBoot技术应用

4系统概要设计 4.1概述 本系统采用B/S结构(Browser/Server,浏览器/服务器结构)和基于Web服务两种模式&#xff0c;是一个适用于Internet环境下的模型结构。只要用户能连上Internet,便可以在任何时间、任何地点使用。系统工作原理图如图4-1所示&#xff1a; 图4-1系统工作原理…