【微服务】分布式事务(通过Seata解决分布式事务问题)

分布式事务

  • 分布式事务
    • Seata
    • 微服务集成Seata
    • XA模式
      • XA模式使用
    • AT模式
      • AT模式实现

分布式事务

在分布式系统中,如果一个业务需要多个服务合作完成,而且每一个服务都有事务,多个事务必须同时成功或失败,这样的事务就是分布式事务,其中每个事务就是一个分支事务,整个业务的事务称为全局事务

要解决分布式事务,各个子事务之间必须能感知到彼此的事务状态,才能保证状态一致
我们需要一个事务协调者

Seata

Seata是蚂蚁金服和阿里巴巴共同开源的分布式事务框架解决方案
官方地址:http://seata.io/
Seata事务管理中由三个重要的角色:
TC-事务协调者:维护全局和分支事务的状态,协调全局事务提交或回滚
TM-事务管理器:定义全局事务的范围,开始全局事务,提交或回滚全局事务
RM-资源管理器:管理分支事务,与TC交谈以注册分支事务和报告分支事务的状态

  • 部署TC服务

Seata由于需要记录信息,所以需要数据存储,Seata支持多种存储模式,但考虑到持久化问题,我们一般选择数据库存储
在这里插入图片描述
分别是分支表,分布式锁,全局表,

然后在虚拟机中通过Docker安装Seata

微服务集成Seata

  1. 在项目中引入Seata依赖:
        <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-seata</artifactId></dependency>
  1. 在application.yml中添加配置,让微服务找到TC服务地址
seata:registry:  #注册中心的配置,微服务根据这些信息去注册中心获取TC服务地址type: nacos #注册中心类型nacos:server-addr: 服务器地址:8848namespace: ""group: DEFAULT_GROUPapplication: seata-server #seata服务名称username: nacospassword: nacostx-service-group: dada #事务组名称service:vgroup-mapping: #事务组与TC集群的映射关系dada: "default"

Seata为用户提供了,AT,TCC,SAGA,XA事务模式进行分布式任务管理

XA模式

XA规范是X/Open组织定义的分布式事务处理(DTP)标准,XA规范,描述了全局的TM与局部的RM之间的接口,几乎所有的主流的数据库都对XA规范提供了支持
在这里插入图片描述
在第一阶段:

  1. RM注册分支事务到TC
  2. RM执行分支业务sql但不提交
  3. RM报告执行状态到TC

在第二阶段:

  1. TC检测各分支事务执行状态
    都成功:通知所有的RM提交事务
    有失败:通知所有的RM回滚事务
  2. RM接收到TC指令,提交或回滚事务
  • 优点

事务的强一致性,满足ACID原则,常用的数据库都支持

  • 缺点

一阶段需要锁定数据库资源,等待二阶段结束才释放,性能较差,依赖关系型数据库实现事务

XA模式使用

1 .修改application.yml文件(每个参与事务的微服务),开启XA模式

seata:data-source-proxy-mode: XA # 开启数据源代理的XA模式
  1. 给发起全局事务的入口方法添加 @GlobalTransactional注解

AT模式

Seata主推的是AT模式,AT模式同样是分阶段提交的事务模型,弥补了XA模型中资源锁定周期过长的缺陷
在这里插入图片描述
阶段一:

  1. 注册分支事务
  2. 记录undo-log(数据快照)
  3. 执行业务sql并提交
  4. 报告事务状态
    阶段二:
    成功:RM删除undo-log
    失败:根据undo-log恢复数据到更新前,进行回滚

AT模式实现

  1. 数据快照需要一张单独的表来存储数据快照(每一个微服务中都需要有一张)
  2. 修改application.yml文件,将事务模式修改为AT模式
seata:data-source-proxy-mode: AT #开启数据源代理的AT模式
  • XA与AT的区别:
  1. XA模式一阶段不提交事务,AT提交
  2. XA模式依赖数据库进行回滚,AT模式利用数据快照实现数据回滚
  3. XA模式强一致,AT模式最终一致

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

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

相关文章

软考系列必过资料分享-系统架构师-系统分析师-信息系统项目管理师

建议,写在前面 知识点是公用的,原则上不分新旧。每年会有少部分的题目切合当前时间段&#xff08;也是通过旧的知识演变的&#xff09; 信息系统项目管理师证书 系统架构师证书 系统分析师证书 资料分享 关注公众号 回复 信息系统项目管理师资料 即可获取信息系统项目管理师资…

【论文速读】|针对模糊驱动生成的提示性模糊测试

本次分享论文&#xff1a;Prompt Fuzzing for Fuzz Driver Generation 基本信息 原文作者&#xff1a;Yunlong Lyu, Yuxuan Xie, Peng Chen, Hao Chen 作者单位&#xff1a;腾讯安全大数据实验室、加州大学戴维斯分校 关键词&#xff1a;软件测试, Fuzzing, 自动化Fuzz驱动…

提高谷歌抓取成功率:代理IP的7个使用误区

在当今数字化时代&#xff0c;数据采集和网络爬取已成为许多企业和个人必不可少的业务活动。对于爬取搜索引擎数据&#xff0c;特别是Google&#xff0c;使用代理IP是常见的手段。然而&#xff0c;使用代理抓取Google并不是一件轻松的事情&#xff0c;有许多常见的误区可能会导…

OpenGL 入门(三)—— OpenGL 与 OpenCV 共同打造大眼滤镜

从本篇开始&#xff0c;会在上一篇搭建的滤镜框架的基础上&#xff0c;介绍具体的滤镜效果该如何制作。本篇会先介绍大眼滤镜&#xff0c;先来看一下效果&#xff0c;原图如下&#xff1a; 使用手机后置摄像头对眼部放大后的效果&#xff1a; 制作大眼滤镜所需的主要知识点&…

有哪些渠道找到海外代理IP服务?

在今天的全球化时代&#xff0c;许多企业和个人都需要跨越国界&#xff0c;与世界各地的资源、信息和市场进行连接。海外代理IP服务成跨境在线业务增效的重要的工具&#xff0c;可以帮助拓展业务宽度&#xff0c;以实现更多样化的业务需求。但是&#xff0c;如何找到合适、安全…

Java | Leetcode Java题解之第70题爬楼梯

题目&#xff1a; 题解&#xff1a; public class Solution {public int climbStairs(int n) {double sqrt5 Math.sqrt(5);double fibn Math.pow((1 sqrt5) / 2, n 1) - Math.pow((1 - sqrt5) / 2, n 1);return (int) Math.round(fibn / sqrt5);} }

多核DSP并行计算跨平台通信解决方案

并行计算的核心是计算节点以及节点间的通信与协调机制。OpenMP虽然给开发者提供了极易上手的增量式开发方式&#xff0c;但是OpenMP在与复杂架构的MCSDK结合后&#xff0c;工具与代码产生了大量不可调试的黑盒子&#xff0c;更是决定了它不能用于关键任务领域&#xff0c;如军工…

优化NGINX性能:使用NGINX_THREADS提高并发处理能力

目录标题 1. 什么是NGINX_THREADS&#xff1f;2. 配置NGINX_THREADS3. 使用NGINX_THREADS处理耗时操作4. 性能调优5. 结论 NGINX作为一个高性能的HTTP和反向代理服务器&#xff0c;在处理高并发请求时表现出色。但随着互联网应用对性能要求的不断提高&#xff0c;深入了解和优化…

C语言(递归)

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸各位能阅读我的文章&#xff0c;诚请评论指点&#xff0c;关注收藏&#xff0c;欢迎欢迎~~ &#x1f4a5;个人主页&#xff1a;小羊在奋斗 &#x1f4a5;所属专栏&#xff1a;C语言 本系列文章为个人学习笔记&#x…

IDEA访问不到静态资源

背景 我在resources下创建static文件夹&#xff0c;再创建front文件夹放前端资源&#xff0c;里面有index.html&#xff0c;游览器输入localhost:8011/front没反应。&#xff08;resources/static/front/index.html&#xff09; 解决办法 重启idea&#xff0c;清楚idea缓存&am…

鸿蒙内核源码分析(ELF格式篇) | 应用程序入口并不是main

阅读之前的说明 先说明&#xff0c;本篇很长&#xff0c;也很枯燥&#xff0c;若不是绝对的技术偏执狂是看不下去的.将通过一段简单代码去跟踪编译成ELF格式后的内容.看看ELF究竟长了怎样的一副花花肠子&#xff0c;用readelf命令去窥视ELF的全貌&#xff0c;最后用objdump命令…

MySQL日志机制【undo log、redo log、binlog 】

前言 SQL执行流程图文分析&#xff1a;从连接到执行的全貌_一条 sql 执行的全流程?-CSDN博客文章浏览阅读1.1k次&#xff0c;点赞20次&#xff0c;收藏12次。本文探讨 MySQL 执行一条 SQL 查询语句的详细流程&#xff0c;从连接器开始&#xff0c;逐步介绍了查询缓存、解析 S…