分布式事务Seata<XA模式、AT模式>解决方案思路(针对多数据源、分库分表、微服务、微服务分库分表4种场景)

seata的xa的方式解决 保证强一致性
原理说明:
1.启动seata服务器TC(控制台7091可以查看)
2.启动spring项目 初始化TM RM,实际上TM和RM注册到TC中
3.浏览器访问执行方法,TM向TC请求开启全局事务,
返回一个全局事务id,存储在threadlocal中;
4.资源管理器threadlocal中获取id,向tc注册分支事务必须携带全局事务,
TC会将分支事务会加入到全局事务中,返回RM一个分支事务id
5注册分支事务成功后,向TC报告执行情况
6.另一个RM同理执行4和5
7.如果都执行成功,TM会通知TC做提交,TC会通知RM做提交
8.如果执行失败,TM会通知TC做回滚,TC会通知RM做回滚

!!!跨数据库
单体项目 配置多数据源
    1.运行2个MySQL
    2.自动代理 开启自动代理默认true,
    指定解决分布式事务模式XA模式;
    方法上添加注解@GlobalTransactional 
     手动代理:关闭自动代理;@Bean手动添加代理数据源
分库分表
1.相同的表结构,表名一样列名一样,事务尤为重要;sharding-jdbc
2.sharding-jdbc支持三种事务 local; xa(其他方法解决)@shardingtransactiontype;@transactional base(seata用的弱一致性)三种事务,
!!!!跨数据库跨进程
微服务项目
下订单 减少库存 扣账户钱 刷新订单状态
4个微服务
买的是什么商品
买几个
谁在买

最基础的seata-all依赖添加,自己.conf配置

seata-spring-boot依赖添加,application.yml添加配置
排除tcc模式,tcc要去找数据源,因为业务微服务不会使用数据源

seata分布式事务失效的场景??
为什么失效?
!!!(1)注册分支事务时没有传递全局事务id,要传递过去,可通过请求头,
通过拦截器,每次使用restemplate请求,放到请求头中;

(2)获取全局事务id 拦截器获取
1浏览器访问业务微服务,注册到TC服务器端,返回全局事务id,
可以收到全局事务id
2.订单、商品、账户微服务注册分支事务,要携带全局事务id,
此时手里没有全局事务id,
!!!seata某些版本的,自动代理使用Druid数据源可以,使用默认数据源可能不行。
!!!全局异常处理导致事务失效,全局异常处理之后,项目将不会出现显示异常,
此时TC认为正常,事务提交。

解决方案一:业务微服务做异常处理,后台服务不做异常处理
解决方案二:手动回滚,判断在不在全局事务中,执行rollback

sping-cloud-starter-alibaba-seata=依赖添加
aop实现,实际就是帮我们处理了,和上面的逻辑一样

远程调用换使用open feign实现 也完全兼容
添加依赖

!!!熔断降级 sentinel 导致分布式事务失效,手动回滚,在降级走的方法里
依赖注入 配置开启
openfeign 与sentinel,降级执行指定方法

seata的at的方式解决 保证弱一致性,要求用户体验
某个时间点或时间段数据不一致,但是数据最终会达到一致。不要求数据库支持xa协议
AT模式 95%场景使用极其推荐,来自于阿里巴巴中间团队提供的TXC服务演化为AT模式;

1.注册全局事务,tc返回全局事务id
2.tm给rm全局事务id,携带全局事务id,向tc注册分支事务id,返回给rm。
3.执行业务代码,直接提交事务。操作过程记录到日志中undo日志
4.向TC报告状态成功。
5.都执行成功,TM通知TC做事务提交,tc通知rm,实际删除undo日志
6.执行失败,TM通TC回滚事务,tc通知rm,按照日志记录回滚事务,恢复操作

全局锁
    什么时全局锁?
        全局锁是由表名和操作记录主键组成,存在文件
    解决并发场景
        rm操作数据库,提交事务的时候,tc端注册全局锁,如果发现已经存在,抛出异常
    释放全局锁
        二阶段提交,TM通知TC做事务提交,tc通知rm提交,放到内存队列
        异步处理,释放全局锁
实战:
多数据源
1.所有数据库添加支持AT的表结构,存储undo日志(线程等待,可以看到数据,弱一致性)
2.添加依赖,配置,自动代理,默认就是AT
3.你选择手动代理,添加seata默认代理数据源

分库分表
1.分库分表策略 shardingsphere 配置2个及以上数据源
sharding: table:表名,指定策略
2.所有数据库添加支持AT的表结构,存储undo日志(线程等待,可以看到数据,弱一致性)
3.添加依赖,配置,自动代理,默认就是AT
4.额外添加依赖,sharding Transaction Base Sesta At
原理是为了提供一个满足ShardingSphere提供的事务管理器的标准的一个事务管理器
5.resources下配置seata.conf配置
6.@Transactional@ShardingTransactionType(TransactionType.BASE)

微服务项目
1.所有数据库添加支持AT的表结构,存储undo日志(线程等待,可以看到数据,弱一致性)
2.添加依赖,编写配置,自动代理默认开启 ,默认就是AT,注意事务失效场景,是否传递,是否数据源版本
3.!!!注解@GlobalTransactional 写在controller层中在某些场景不生效,
有业务系统是可以。

4.注解@GlobalTransactional放到service层实现反而可能生效。
5.!!!切换数据源Druid时,yml添加配置如果指定数据源为spring_datasource_type,,seata不会自动代理不生效。直接向容器中添加Druiddatasource,seata在自动代理at模式会生效。

AT模式和XA模式在不同场景下解决比较????
微服务项目加分库分表(必须学会)
1.分表策略配置好
2.AT模式所需要的表结构
3.cloud——seata依赖,
4.seata——at依赖(第7点)
5.seata配置(druid数据源注意)
6.添加注解@GlobalTransactional
7.加在impl业务涉及到的分库分表微服务;seata.conf配置,
执行代码之前加入编码如下:TransactionTypeHolder.set(TransactionType.BASE)

TCC模式
不需要表结构支持,自己编写提交 回滚操作

Saga模式

seata分布式集群部署,实现高可用。
seata启动使用是存储数据的,所以集群要共享数据(全局事务id)。
可以放高性能redis 高可用可以放mysql,用来存储数据
1.window存储在mysql,运行自带的脚本4张表,
2.seata配置,application.yml,选择db连接
3.seata整合nacos,application.yml,注册到nacos上,微服务修改seata配置,使用nacos模式

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

deepin 亮相 Intel 合作伙伴交流会,展示AI大模型应用最新成果

内容来源:deepin 社区 2024 年 4 月 18 日,备受业界瞩目的 Intel Channel Partner Networking Fair 在香港天际万豪酒店隆重举办。 在这场行业盛会上,deepin(深度)受邀参与了 Intel Demo Showcase 环节,向…

JDBC查询大数据时怎么防止内存溢出-流式查询

文章目录 1.前言2.流式查询介绍3.使用流式查询3.1不开启流式查询的内存占用情况3.2开启流式查询的内存占用情况 4.开启流式查询的注意点 1.前言 在使用 JDBC 查询大数据时,由于 JDBC 默认将整个结果集加载到内存中,当查询结果集过大时,很容易…

python与pycharm如何设置文件夹为源代码根目录

相信大家遇到过下面这种情况 当我们在当前项目下引入了其它项目的代码,这是其它项目的包的导入路径是不用于当前项目的,这样导致项目无法正常起来,但是我们又不可能一个个文件去处理,这时可以用下面的方式解决 pycharm直接设置 …

Centos 5 的yum源

背景 有使用较老的Centos 5 系统内部安装软件无法正常报错,是由于系统叫老yum源存在问题 处理方法 更换下述yum源,可以将其他repo源文件备份移动到其他目录,添加下述源后重新测试 [C5.11-base] nameCentOS-5.11 baseurlhttp://vault.c…

非对称渐开线齿轮学习笔记分享

最近有小伙伴遇到了非对称渐开线齿轮的加工问题,花了些时间学习了解一下,下面是总结的学习笔记,有兴趣的朋友可以瞅瞅: 目录: 为什么要采用非对称? 非对称有什么优点? 非对称齿形如何加工? 非对称齿轮怎么测量? 非对称齿轮建模 为什么要采用非对称? 现在的传动要求…

【SSM进阶学习系列丨整合篇】Spring+SpringMVC+MyBatis 框架配置详解

文章目录 一、环境准备1.1、创建数据库和表1.2、导入框架依赖的jar包1.3、修改Maven的编译版本1.4、完善Maven目录1.5、编写项目需要的包1.6、编写实体、Mapper、Service 二、配置MyBatis环境2.1、配置mybatis的主配置文件2.2、编写映射文件2.3、测试环境是否正确 三、配置Spri…

streamlit data_editor学习之 LLM理论内存占用量计算器

streamlit data_editor学习之 LLM理论内存占用量计算器 一.效果二.代码三.运行命令四.参考链接 根据用户设置的LLM参数,计算设备内存的占用量。以web的形式方便共享,可以插入多条记录,表格更新后,可以动态计算结果 一.效果 二.代码 import streamlit as st #1.31.1 import cv…

【八股】Spring Boot

SpringBoot是如何实现自动装配的? 首先,SpringBoot的核心注解SpringBootApplication里面包含了三个注解,SpringBootConfigurationEnableAutoConfigurationComponentScan,其中EnableAutoConfiguration是实现自动装配的注解&#x…

如何最大程度使用AWS?

随着云计算技术的不断发展,AWS已经成为众多企业的首选,为其提供了强大的基础设施和服务。那么如何最大程度地、灵活地利用AWS,成为许多企业专注的焦点。九河云作为AWS的合作伙伴,为读者们提供一些技巧和策略,帮助读者充…

UL认证防逆流多功能监测装置AGF-AE-D

安科瑞薛瑶瑶18701709087/17343930412 在单逆变器系统中,仪表直接与逆变器相连。如果您的变频器有一个内置的收入等级表(RGM;该变频器 被称为收入等级变频器),您可以在 RGM 的同一总线上连接一个外部仪表。

【React】Sigma.js框架网络图-入门篇(2)

通过《【React】Sigma.js框架网络图-入门篇》有了基本认识 由于上一篇直接给出了基本代码示例,可能看着比较复杂也不知道是啥意思; 今天从理论入手重新认识下! 一、基本认识 首先,我们先了解下基础术语: 图(Graph)&…

波高仪:数字浪高仪解析

波高仪,也被称为数字浪高仪,是一种专门用于测量波浪高度的设备。它采用低功耗微处理器、24bit高精度AD转换器和长距离通信技术,配备电容式波高传感器,具有线性好、功耗低、量精度高、传输距离远、性能稳定、抗干扰能力强等特点。 …

vue中使用echarts实现X轴动态时间(天)的折线图表

项目要求x轴以一天为间隔&#xff0c;时间是动态返回的数据&#xff0c;折线图平滑展示 实现代码如下&#xff1a; <div class"echarts-main"><v-chart ref"echarts" :options"options" /> </div>// 局部引入vue-echarts im…

Python实现线性拟合及绘图

Python实现线性拟合及绘图 当时的数字地形实验&#xff0c;使用matplotlib库绘制了一张图表表示不同地形类别在不同分辨率下的RMSE值&#xff0c;并分别拟合了一条趋势线。现在来看不足就是地形较多时&#xff0c;需要使用循环更好一点&#xff0c;不然太冗余了。 代码逻辑 …

【讯为Linux驱动笔记1】申请一个字符设备

Linux下每个设备都需要有一个专属设备号&#xff1a;主设备号 次设备号 【申请字符设备】 主设备号&#xff1a;一类驱动&#xff1a;如&#xff1a;USB驱动 次设备号&#xff1a;这类驱动下的某个设备 如&#xff1a;键盘鼠标 设备号是32位的dev_t类型的&#xff0c;高12位主…

Python对Excel两列数据进行运算

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 Python对Excel两列数据进行运算 在日常工作中&#xff0c;经常会遇到需要对Excel表格中的数…

Scala 04 —— Scala Puzzle 拓展

Scala 04 —— Scala Puzzle 拓展 文章目录 Scala 04 —— Scala Puzzle 拓展一、占位符二、模式匹配的变量和常量模式三、继承 成员声明的位置结果初始化顺序分析BMember 类BConstructor 类 四、缺省初始值与重载五、Scala的集合操作和集合类型保持一致性第一部分代码解释第二…

Python 数据可视化 boxplot

Python 数据可视化 boxplot import pandas as pd import matplotlib.pyplot as plt import numpy as np import seaborn as sns# 读取 TSV 文件 df pd.read_csv(result.tsv, sep\t)normal_df df[df["sample_name"].str.contains("normal")] tumor_df df…

【Git教程】(十五)二分法排错 — 概述及使用要求,执行过程及其实现(用二分法人工排错或自动排错),替代解决方案 ~

Git教程 二分法排错 1️⃣ 概述2️⃣ 使用要求3️⃣ 执行过程及其实现3.1 用二分法人工排错3.2 用二分法自动排错 4️⃣ 替代解决方案 在开发过程中&#xff0c;我们经常会突然遇到一个错误&#xff0c;是之前早期版本在成功通过测试时没有出现过的。这时候&#xff0c;时下较…
最新文章