分布式事务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.mzph.cn/web/3620.shtml

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

相关文章

ubuntu快捷更pip源

py安装: apt-get install python3-pip终端输入: pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/

基于 Spring Boot 博客系统开发(二)

基于 Spring Boot 博客系统开发(二) 本系统是简易的个人博客系统开发,为了更加熟练地掌握SprIng Boot 框架及相关技术的使用。🌿🌿🌿 基于 Spring Boot 博客系统开发(一)&#x1f4…

【DataGrip】导出导入迁移数据库表

文章目录 前言迁移表结构导出表结构导入表结构 迁移表数据导出表数据导入表数据 前言 DataGrip导出数据库表结构跟表数据是分开的,所以需要分两个步骤来完成。 DataGrip版本:2024.1.1 DataGrip官方文档地址:https://www.jetbrains.com/help/d…

第5章 全局大喇叭——详解广播机制

第5章 全局大喇叭——详解广播机制 如果你了解网络通信原理应该会知道,在一个IP网络范围中,最大的IP地址是被保留作为广播地址来使用的。 比如某个网络的IP范围是192.168.0.XXX,子网掩码是255.255.255.0,那么这个网络的广播地址…

用 JetBrains DataGrip 连接 Huawei openGauss

参考文章https://blog.itdevwu.com/post/1632/ DataGrip 连接GaussDB数据库的时候,会出现身份验证只能通过无验证或 pgpass 进行,而没有需要的用户名-密码的方式,也就无处填写 user 和 password。 而如果直接使用 DataGrip 自带的 PostgreSQ…

【Pytorch】(十四)C++ 加载TorchScript 模型

文章目录 (十四)C 加载TorchScript 模型Step 1: 将PyTorch模型转换为TorchScriptStep 2: 将TorchScript序列化为文件Step 3: C程序中加载TorchScript模型Step 4: C程序中运行TorchScript模型 【Pytorch】(十三)PyTorch模型部署: T…

【SAP ME 32】Java调用SAP ME发布的WebService接口

目录 1、描述 2、检验WebService接口 3、SOAPUI检验 4、 示例源码 4.1、DataGlobalAGVController

LVS + KeepAlived实现高可用负载均衡

上文已经介绍了lvs和keepalived的基本概念和用法,下面直接做lvs和keepalived来实现高可用负载均衡 配置: 主机名ip系统用途client172.16.147.1mac客户端lvs-keepalived-master172.16.147.154centos7.5分发器lvs-keepalived-slave172.16.147.155centos7…

09.JAVAEE之网络初识

1.网络 单机时代 >局域网时代 >广域网时代 >移动互联网时代 1.1 局域网LAN 局域网,即 Local Area Network,简称LAN。 Local 即标识了局域网是本地,局部组建的一种私有网络。 局域网内的主机之间能方便的进行网络通信&#xff0…

web3 入门记录

密码学 柯尔霍夫原则,也被称为克尔克霍夫定律,是密码学中的一个核心原则。这个原则简单来说,就是指一个密码系统即便在除了密钥之外的所有信息都被公开的情况下,仍然应该是安全的。 为了更好地理解这个原则,我们可以…

【Redis】深度学习与实践指南系列

本篇是Redis系列的目录。涵盖了 Redis 的基础知识、数据类型、持久化策略、高可用性方案、与 Spring Boot 的整合,以及性能调优等多个方面。 目录 Redis 基础 Redis 是什么?数据类型及使用场景 简介:这篇文章作为系列的开端,介…

数据结构四:线性表之带头结点的单向循环链表的设计

前面两篇介绍了线性表的顺序和链式存储结构,其中链式存储结构为单向链表(即一个方向的有限长度、不循环的链表),对于单链表,由于每个节点只存储了向后的结点的地址,到了尾巴结点就停止了向后链的操作。也就…

TGRS 2023.12基于矢量多边形和深度学习的高分辨率遥感影像土地覆盖变化检测

首先,采用增强型简单线性迭代聚类(SLIC)算法对同一区域的双时相图像进行分割。随后,使用多尺度提取、裁剪和绘制方法生成带注释的数据集。接下来,分使用时态前和时态后图像的数据集进行训练和测试,并使用双分类器交叉验证对训练集…

uniapp对uni.request()的封装以及使用

官方文档 uni.request(OBJECT) | uni-app官网 (dcloud.net.cn) uni.request参数 参数名说明url是写api地址的data是用来传值的对于 GET 方法,会将数据 转换为 query string。例如 { name: name, age: 18 } 转换后的结果是 namename&age18。对于 POST 方法且 …

Lustre架构介绍的阅读笔记-SMB协议

本文是在阅读Introduction to Lustre* Architecture的Lustre SMB Gateway System Architecture时的笔记。 Lustre只支持Linux系统,但借助Samba可以支持SMB协议,进而对Windows主机提供文件访问能力。 参考资料 Welcome to the CTDB web pages CTDB is …

k8s pod 无法启动一直ContainerCreating

情况如下,更新 pod 时,一直在ContainerCreating 查看详细信息如下 Failed to create pod sandbox: rpc error: code Unknown desc [failed to set up sandbox container “334d991a478b9640c66c67b46305122d7f0eefc98b2b4e671301f1981d9b9bc6” networ…

viewerjs在vue中实现点击图片预览、切换、缩放、拖拽、旋转等功能

1、下载依赖&#xff1a; npm i viewerjs 2、定义html结构 <template> <div><ul class"artBody"><li><img src"picture-1.jpg" alt"Picture 1"></li><li><img src"picture-2.jpg" alt&…

Find My头盔|苹果Find My技术与头盔结合,智能防丢,全球定位

头盔是保护头部的装具&#xff0c;是人们交通中不可或缺的工具。头盔具有保护头部、吸收冲击力、减少伤害风险、提高安全性、防止颅脑损伤等功效作用。头盔能够提供额外的保护&#xff0c;减少头部受伤的风险。在日常出行或进行高风险活动过程中&#xff0c;如骑自行车、骑行电…

pytest参数化数据驱动(数据库/execl/yaml)

常见的数据驱动 数据结构&#xff1a; 列表、字典、json串 文件&#xff1a; txt、csv、excel 数据库&#xff1a; 数据库链接 数据库提取 参数化&#xff1a; pytest.mark.parametrize() pytest.fixture()…

oracle 执行计划详解

执行计划是指示 Oracle 如何获取和过滤数据、产生最终的结果集&#xff0c;是影响SQL 语句执行性能的关键因素。在深入了解执行计划之前&#xff0c;首先需要知道执行计划是在什么时候产生的&#xff0c;以及如何让 SQL 引擎为语句生成执行划。 先了解 SQL 语句的处理执行过程…