SpringCloud-高级篇(七)

news2024/11/24 10:41:06

前面在微服务里整合了Seata,下面利用Seata去解决分布式事务的问题,回去学习Seata中的四种解决方案  :首先学习XA模式

(1)XA模式

RM在前面讲的是资源管理器,在XA标准中RM都是由数据库来实现的,数据库本身实现了这个功能

XA是分布时事务领域最早的一个标准,几乎主流的数据库都实现了这个标准

XA是基于数据库本身的特性来去实现分布式事物的,是能够满足ACID的特性的,它是一种强一致性的事务

Seata实现的 是在数据库xa模式基础上做了一层封装,实现起来是比较简单的  ,它多了一个TM做整个事务的一个注册个管理,变的健壮

优势:

1.在第一阶段只是执行事务而不提交,事务一直处于运行中的一个状态的,事务本身具备ACID的特性,到了第二阶段,等到所有的分支事务都执行完了然后才一起提交,因为这个特性,每个事务都是ACID的,并且大家相互等待,因此整个事务都能实现ACID,认为这种XA具备强一致性的

2.数据库本身都实现了XA模式,数据库本身已经实现了对应的接口,你调用我我去执行,实现各种各样的功能,它是比较容器去实现分布式的效果的,Seata实现这种XA模式的时候也仅仅是在数据库接口上做了一层简单的封装形成RM,用起来非常的简单 

 缺点:

1.第一阶段不提交,等着第二阶段在提交,在等的时候占用数据库的锁,比如一个事务跨越了四五个更多的事务,每个事务执行完了还得等着别人,如果这个业务耗时较长,四五个分支都执行完耗时很久,整个事务过程中不提交占用系统资源,占用数据库锁,被人都不能访问,是一种资源的浪费,性能比较差,可用性低

2.这种方式依赖数据库底层的实现的,用起来比较简单了,但是如果数据库不支持比如Redis库,就没有办法做了

把数据源形成了一个代理,将来发起的业务sql,都会被Seata(RM)拦截下来,内部调用数据的这种接口,从而实现XA模式,数据源的配置,在参与全局事务的微服务里都需要去添加

给去全局事务的入口方法添加全局事务的注解,全局事务都由一个入口,这个入口要把它标记起来,这样我们的Seata就知道去全局事务是从哪里开始的,就会用TM代理这个方法,从这个方法开始,调用了哪些微服务我们的Seata就知道了,一个微服务的参与者就是一个分支事务了这样去全局事务的边界就定义下来了 ,这个注解只要在入口添加

(2)XA模式实现

在每个微服务里添加:XA配置 

在OrderService中的入口方法添加注解:@GlobalTransation

重启微服务

在Seata控制台里服务会重新注册:

现在的数据库:

Order表 

 account表

storage表: 

发起订单当余额充足,数量充足的时候:

数据库表正常减少:

库存-2

越-2 

订单新增:

当购买数量超过剩余的:

去看数据库会不会回滚:发现数据库还是原样没有发生变化,发生了回滚

查看日志:库存报错了

余额执行了回滚 

(3)AT模式

AT模式跟XA模式的区别是执行完业务sql,而是直接提交不是等待执行,就没有资源的等待了,直接释放了,性能就会提高 

虽然提交了,但是怎么保持数据状态的一致性呢?它会在提交前后形成一个快照,如果有问题及时回滚原样

(4)AT模式存在的问题

AT相比XA模式性能得到了提高,但是正是由于提前释放了资源,没有去做锁,这就导致了在并发访问的时候,会存在一些安全问题

会存在并发访问是,丢失更新的问题,事务一回滚后的是100,相当于事务二没有进行操作

这是因为事务没有存在隔离,事务2插入进来,事务一阶段二运行的时候出现脏数据,归根是隔离的原因,比如说阶段一和阶段二都是一个锁定状态,别人没有办法插入进来,就不会出现问题

为了解决这个问题AT模式引入全局锁

虽然说加了全局锁,但是AT模式的性能依赖比XA模式好,XA是数据库的锁,锁不释放,所有人不能访问数据,因为全局锁记录操作这张表的全局事务有Seata来管理的,如果其他事务(比如修改的是其他字段)不是有Seata来管理的 是没有影响的,AT全局锁锁定的范围是比较小的,所以性能较好

但是可能会有极端的情况 当你在修改money的过程中,有一个其他的事务没有由Seata来管理,这个时候他不需要获取全局锁也会出现这种问题,只是这种可能较低

原因:1.因为全局事务大多数执行是成功的  2.分布式事务耗时比较长,因此它的并发比较低,我们在业务上也会尽量避免多个事务去操作了同一个字段

AT对于这种极少的情况也可以这样解决:

事务一会拿更新后的快照,跟当前的数据库的值作一个对比,如果一样则证明没有其他事务更改过,可以进行回滚,不一样说明有事务做了更改Seata就知道不能修改了,这个时候需要人工介入解决

(5)AT模式实现

全局锁表lock_table 快照表undo_log

在seata相关的库中中导入

在于微服务相关的库seata_demo中新建:

更改每个微服务的模式:AT

重启服务:查看数据库表

发起异常订单: 

然后查询数据库还是原样

 新建的表也是临时存储一下数据,事务回滚完也就删除了,打断点可以看到表中的数据

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

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

相关文章

【二分查找】【双指针】LeetCode:2565最少得分子序列

作者推荐 【动态规划】【广度优先】LeetCode2258:逃离火灾 本文涉及的基础知识点 二分查找算法合集 有序向量的二分查找,初始化完成后,向量不会修改。 双指针: 用于计算子字符串是s的字符串的子系列。 题目 给你两个字符串 s 和 t 。 你…

19.java绘图

A.Graphics类 Graphics类是java.awt包中的一个类,它用于在图形用户界面(GUI)或其他图形应用程序中进行绘制。该类通常与Component的paint方法一起使用,以在组件上进行绘制操作。 一些Graphics类的常见用法和方法: 在组…

Java基础语法之类和对象

类的定义 类就是对一个实体的属性功能进行描述 类的定义格式 首先要用到class关键字; 其次,类名采用大驼峰形式例如Dog ClassName Student…… 最后,类中包含该类的属性,即成员变量;以及该类的功能&#xff0…

HelpLook VS Confluence:知识管理方面谁更有优势?

多年来,在线协作和文档工具市场一直被Confluence所主导。Confluence由Atlassian于2004年创立,很迅速地成为企业寻求强大而全面的协作解决方案和知识管理的热门选择。然而,随着新工具如Notion和HelpLook的出现,市场格局发生了变化&…

各地加速“双碳”落地,数字能源供应商怎么选?

作者 | 曾响铃 文 | 响铃说 随着我国力争2030年前实现“碳达峰”、2060年前实现“碳中和”的“双碳”目标提出,为各地区、各行业的低碳转型和绿色可持续发展制定“倒计时”时间表,一场围绕“数字能源”、“智慧能源”、“新能源”等关键词的创新探索进…

十六 动手学深度学习v2计算机视觉 ——样式迁移

文章目录 基于CNN的样式迁移 基于CNN的样式迁移 我们通过前向传播(实线箭头方向)计算风格迁移的损失函数,并通过反向传播(虚线箭头方向)迭代模型参数,即不断更新合成图像。 风格迁移常用的损失函数由3部分组…

【lombok】从easyExcel read不到值到cglib @Accessors(chain = true)隐藏的大坑

背景: 在一次使用easyExcel.read 读取excel时,发现实体类字段没有值,在反复测试后,发现去掉Accessors(chain true)就正常了,为了验证原因,进行了一次代码跟踪 由于调用链路特别长,只列举出部分代码&#x…

141 环形链表

解题思路: \qquad 最容易想到的方法,就是遍历链表同时用哈希表unordered_map把节点存下来: \qquad\qquad 遇到重复节点则认为存在环,返回true; \qquad\qquad 遍历到nullptr,则链表中不存在环&#xff0c…

使命召唤9缺少buddha.dll的解决方法分享,如何快速修复buddha.dll

《使命召唤》系列作为备受欢迎的第一人称射击游戏,经常会在新作发行后引起广大玩家的讨论。最近,《使命召唤9》玩家中出现了一个常见的技术问题:游戏无法启动,因为系统找不到 buddha.dll 文件。这篇文章将探讨 buddha.dll 的相关信息、丢失原…

奥比中光 Femto Bolt相机ROS配置

机械臂手眼标定详解 作者: Herman Ye Auromix 测试环境: Ubuntu20.04/22.04 、ROS1 Noetic/ROS2 Humble、X86 PC/Jetson Orin、Kinect DK/Femto Bolt 更新日期: 2023/12/12 注1: Auromix 是一个机器人爱好者开源组织。 注2&#…

机器学习笔记 - 基于C# + .net framework 4.8的ONNX Runtime进行分类推理

该示例是从官方抄的,演示了如何使用 Onnx Runtime C# API 运行预训练的 ResNet50 v2 ONNX 模型。 我这里的环境基于.net framework 4.8的一个winform项目,主要依赖下面版本的相关库。 Microsoft.Bcl.Numerics.8.0.0 Microsoft.ML.OnnxRuntime.Gpu.1.16.3 SixLabors.ImageShar…

“百里挑一”AI原生应用亮相,百度智能云千帆AI加速器首个Demo Day来了!

作者简介: 辭七七,目前大二,正在学习C/C,Java,Python等 作者主页: 七七的个人主页 文章收录专栏: 七七的闲谈 欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖&#x1f…

机器视觉系统选型-同轴光源分类及应用场景

同轴光源 从与相机同轴的方向均匀照射漫射光 Mark点定位条码识别二维码识别反光物体表面缺陷检测 高亮同轴光源 照射光线与水平方向成低角度夹角Mark点定位反光件表面凹坑、损伤、缺陷印刷电路板二维码识别 平行同轴光源 从与相机同轴方向照射平行度高 的平行光尺寸测量玻璃检…

Linux---Ubuntu操作系统

1. Ubuntu操作系统的介绍 Ubuntu操作系统是属于Linux操作系统中的一种,它是免费、稳定又可以拥有绚丽界面的一个操作系统 2. Ubuntu图形界面的介绍 任务栏 窗口操作按钮 窗口菜单条 任务栏效果图: 窗口操作按钮效果图: 窗口菜单条效果图: 3. 与Windows目录结…

单变量线性回归的机器学习代码

本文为学习吴恩达版本机器学习教程的代码整理,使用的数据集为https://github.com/fengdu78/Coursera-ML-AndrewNg-Notes/blob/f2757f85b99a2b800f4c2e3e9ea967d9e17dfbd8/code/ex1-linear%20regression/ex1data1.txt 将数据集和py代码放到同一目录中,使…

HarmonyOS(二)—— 初识ArkTS开发语言(下)之ArkTS声明式语法和组件化基础

前言: 通过前面ArkTS开发语言(上)之TypeScript入门以及ArkTS开发语言(中)之ArkTS的由来和演进俩文我们知道了ArkTS的由来以及演进,知道了ArkTS具备了声明式语法和组件化特性,今天,搭…

计网 - 如何理解 Mac地址 、 IP地址 、端口号

文章目录 概述Mac地址IP 地址IP 地址和 MAC 地址之间的区别端口号为什么端口号有 65535 个?端口号的确定标准既定的端口号时序分配法 观察端口号 小结 概述 Mac地址(Media Access Control Address)和IP地址(Internet Protocol Ad…

蓝桥杯小白赛第一场(1~6)(期望DP)

1、模拟 2、贪心 3、前缀和 4、猜结论 5、双指针 6、期望DP 1. 蘑菇炸弹 思路&#xff1a;一个简单的暴力模拟。 #include <bits/stdc.h> using namespace std; int main() {int n;cin >> n;vector<int>a(n , 0);for(int i 0 ; i < n ; i )cin &…

西南交通大学【数据结构实验8】

实验内容及要求&#xff1a; 编写控制台应用程序&#xff0c;提供以下菜单项&#xff1a; 插入元素 从键盘输入若干两两互不相同的非0整数&#xff0c;直到输入0时停止。将输入的所有非0整数按输入次序插入二叉排序树(初始时是空树)。 插入某个非0整数时&#xff0c;若该整…

Linux——基本指令(二)

​ 个人主页&#xff1a;日刷百题 系列专栏&#xff1a;〖C语言小游戏〗〖Linux〗〖数据结构〗 〖C语言〗 &#x1f30e;欢迎各位→点赞&#x1f44d;收藏⭐️留言&#x1f4dd; ​ ​ 写在前面&#xff1a; 紧接上一章&#xff0c;我们在理解接下来的命令之前&#xff0c…