日常学习记录随笔-seata

news2024/9/24 15:20:58
我们知道所有的事务都要满足ACID的原则,也就是原子性 一致性 隔离性 持久性
在单体架构中服务访问db.基于数据库本身的特性就能够实现acid
微服务的架构比较复杂 可能一个业务要跨越多个服务 
每个服务又会有自己的db库   再靠数据库本身的特性 还能保证acid么

在这里插入图片描述

这个业务 就包含3个不同的微服务调用  每个微服务都有自己的数据库/独立的事务
我们最终希望的是事务一旦执行 每一个都的成功,如果失败的话 都的失败
但是能不能达成这种情况
基于业务发生的调用
正常情况下
order(订单创建)---->account(余额扣减)---->storage(库存扣减)
如果有一个失败 就代表全部失败了
库存失败了 但是余额扣减了 这个时候事务的状态不是一致的

在这里插入图片描述

为什么会出现这种情况?  
因为我们每一个服务都是独立的,库存抛异常,我账户是不知道的
每一个服务是独立的所以他们的事务也是独立的,我订单和账户业务结束了,我就commit了
我都提交了怎么做的回滚
所以最终就没有达成数据状态一致   此时就出现了分布式事务的问题

在这里插入图片描述

我们要保证所有分支事务都成功,或者所有分支事务都失败
呢为什么分布式事务出现问题,就是因为各个服务/分布式事务之间互相是感知不到的
状态不能一致
怎么去解决分布式事务的问题 
{
1、分布式事务产生的原因
2、分析解决思路
3、Seata底层原理 怎么解决分布式事务
4、动手实践了 利用seata框架 去解决我们的问题
}
1. 解决分布式事务的理论基础cap/base理论
C(一致性)
A(可用性)
P(分区容错性)

在这里插入图片描述

C(一致性): 如果我对node1节点进行了更改,为了满足一致性,我就要做数据同步 吧node1节点数据同步到node2上
只有及时完成数据同步,才可以满足一致性
A(可用性):如果此时node3不可用  整个集群是对外提供服务的 可以访问集群的node1以及node2

在这里插入图片描述

P(分区容错性):因为网络原因node3和(node1/node2)断开连接 .node1 node2正常连接   node感知不到
此时整个集群划分了2个分区了
如果此时insert 到node2 ,此时分区数据就会不一致,node3同步不了分区数据

在这里插入图片描述

当网络出现分区时  可用性和一致性没有办法同时满足
但是分区是不可避免的 只要有一个分布式系统,节点之间一定是通过网络连接的
没有办法保证节点永远是健康的
分区一定会出现
要么C 要么A  没有办法同时满足

在这里插入图片描述

cap下在分布式系统中,分区是不可避免的,所以不得不在一致性和可用性之间做出选择
BASE理论

在这里插入图片描述

分布式事务包括什么问题
分支事务 有些成功 有些失败了.这个时候大家状态是不一致的
我们希望分布式事务中的每一个分支事务 大家最终都是成功的、或者失败的
状态是一致的.要么都成功 要么都失败
呢我们基于BASE理论怎么解决  AP  满足可用性 牺牲一致性

在这里插入图片描述

我们解决分布式事务都会基于ap和cp的思想去做
分布式事务的模型:

在这里插入图片描述

1.分支事务上报
2.事务些调整统一做回滚或者提交
每一个子系统的事务叫做分支事务  整个分布式事务叫做全局事务
事务协调者实际上就是协调各个分之事务状态的 让他们达成一致

在这里插入图片描述

以上就是我们解决分布式事务的思想和模型了
我们基于CAP定律和base理论 总结了分布式事务的解决思路和最后的模型
我们看看seata架构 看看seata架构和我们总结的模型有什么差别

在这里插入图片描述

seata架构:

在这里插入图片描述

分布式seata:
3. tc 服务搭建(注册在注册中心中)
4. tm 开启全局事务
5. rm 注册分支事务 (rm 和tc 建立连接是在注册中心中寻找的)  Rm和tm建立一个联系 必然通过注册中心去寻找   基于nacos注册
6. 让对应的rm  通过注册中心 找到对应的tc 服务
利用seata 去解决分布式事务的问题    seata中4中解决方案(xa,at,tcc,saga)

xa:  是一种规范  所有主流db 都支持xa
xa模式有什么优势和不足??
我们一阶段仅仅是执行事务而不提交 
呢我们的事务还一致处于运行的状态
到了二阶段 等到所有的分支事务都执行完了  我们再一起提交

xa的工作原理

在这里插入图片描述

缺点就是:强一致性 二阶段再提交,但是你等的过程中要占用分布式锁,如果跨越分支事务
如果这个业务耗时较长这么多分支事务要耗时很久
占用数据库锁  别人都不能访问  可用性就降低了
第二个就是数据库要支持

在这里插入图片描述

1.AT模式:at模式执行完业务sql后会直接提交事务,而不是等待因为他不是等待是立即提交了
所以他是没有对资源锁定了
2.所以他的性能方面会优于xa 此时的状态有成功的有失败的
3.at模式在执行业务sql之前会执行一个快照 如果出现问题了会依据快照恢复
第一阶段结束了 报告状态到tc 就可以了
AT:工作原理
at和tc的区别
如果一阶段有失败了 我基于log做数据恢复  数据一旦恢复 Log也没用了 

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

at模式 相对于xa来说 性能得到提升了
每天要让自己进行输出  让自己前进  哪怕前进一点点也可以

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

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

相关文章

翻译:网站整站翻译 / 网站国际化 / 极简实现

一、本文目标 以极简单的方法实现整站翻译,轻松实现国际化。 二、js 文件 https://res.zvo.cn/translate/translate.js 三、代码 代码放在浏览器控制台即可实现 var head document.getElementsByTagName(head)[0];var script document.createElement(script);sc…

【算法|动态规划No.17】leetcode64. 最小路径和

个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 🍔本专栏旨在提高自己算法能力的同时,记录一下自己的学习过程,希望…

多路彩灯控制器LED流水灯花型verilog仿真图视频、源代码

名称:多路彩灯控制器LED流水灯花型verilog 软件:Quartus 语言:Verilog 代码功能: 用quartus和modelism,设计一个多路彩灯控制器,能够使花型循环变化,具有复位清零功能,并可以选择…

unity操作_光源组件 c#

准备工作 添加资源导入后先不管,现在主要学习自带Directional Light 我们首先创建一个平面Plane 然后重置一下位置 然后创建一个Cube 也重置一下位置然后修改y0.5刚好在这个平面上 ctrl d复制一个Cube 修改位置和旋转角度 给物体一个颜色 接下来创建一个点光源 我们…

基于python判断回文字符串

一、功能程序 可以使用以下代码,来判断一个字符串是否为回文字符串: def is_palindrome(string):# 将字符串转换为小写,并去除空格和标点符号string .join(e for e in string.lower() if e.isalnum())# 检查字符串是否等于它的反转return …

SpringCloud学习笔记-Ribbon负载均衡

目录 1.负载均衡策略2.自定义负载均衡策略3.饥饿加载 SpringCloudRibbon的底层采用了一个拦截器,拦截了RestTemplate发出的请求,对地址做了修改。用一幅图来总结一下: 基本流程如下: 拦截我们的RestTemplate请求http://userserv…

每日练习-9

目录 1、井字棋 2、密码强度等级 3、二维数组中的查找 4.调整数组奇数偶数 5.旋转数组中的最小元素 6、替换空格 1、井字棋 解析:井字棋有四种情况表示当前玩家获胜,行全为1, 列全为1,主对角全为1, 副对角全为1。遍历…

pytorch学习------TensorBoard的使用

目录 简介使用方式1、单条曲线(scalar)2、多条曲线(scalars)3、直方图(histogram)4、图片(image)5、渲染(figure)6、网络(graph) 简介 建好一个神经网络,其实我们也不知道神经网络里头具体细节到底做了什么,要人工调试十分困难(就好比你无法想象出递归的…

Markdown文本编辑器常用操作介绍

文章目录 标题文本样式列表图片链接目录插入代码插入表格 背景说明 Markdown语言是国际杂志编辑以及许多写作者都广泛使用的写作语言它使用一些简单的符号(* / > [] () #)来标记文本格式其简洁的语法、优美的格式以及强大的软件支持深受广大网友的喜…

基于蝠鲼觅食优化的BP神经网络(分类应用) - 附代码

基于蝠鲼觅食优化的BP神经网络(分类应用) - 附代码 文章目录 基于蝠鲼觅食优化的BP神经网络(分类应用) - 附代码1.鸢尾花iris数据介绍2.数据集整理3.蝠鲼觅食优化BP神经网络3.1 BP神经网络参数设置3.2 蝠鲼觅食算法应用 4.测试结果…

Java @Override 注解

在代码中,你可能会看到大量的 Override 注解。 这个注解简单来说就是让编译器去读的,能够避免你在写代码的时候犯一些低级的拼写错误。 Java Override 注解用来指定方法重写(Override),只能修饰方法并且只能用于方法…

自定义背景画词云图(中文)

背景 词云图还是挺需要用的吧,大量的词中,我们可以快速捕捉到高频的关键的词汇。 环境:python3 对csv文件里面某列所有字符串画词云图(中文的字符) 新安装环境: 1.下载中文字体SimHei.ttf,并放…

C++DAY41

#include <iostream>using namespace std;class Per { private:string name;int age;float* height;float* weight; public:Per(){cout << "Per::无参构造函数" << endl;}Per(string name,int age,float* height,float* weight):name(name),age(ag…

RustDay01——运行在线GitHub Rust环境

1.跟着教程进入GitHub教室 2. 授权确认后进入学习空间 3.点击链接进入在线平台 4.添加本机密钥对到GitHub 5. 安装依赖 我们使用在线的Linux试验平台&#xff0c;就自动帮我们clone好了仓库 我们直接在仓库目录执行 cargo install --force --path . 安装依赖 PS:其实刚开始…

Godot 添加信号

前言 Godot 里面C#和GDScirpt 的用法完全不一样&#xff0c;网上相关资料太少了。 什么是信号 信号分为信号源&#xff0c;触发&#xff0c;目的节点。信号源在某些条件下触发信号&#xff0c;比如按钮点击&#xff0c;鼠标悬停等事件 #mermaid-svg-wyr9ARVcBFmUUu8y {font-…

哈希传递原理

哈希传递只针对相同密码进行攻击。 NTLM认证流程 NTLM加密&#xff1a; admin -> hex(16进制编码) 61646d696e61646d696e-> Unicode 610064006d0069006e00610064006d0069006e00–>MD4209c6174da490caeb422f3fa5a7ae634 认证过程&#xff1a; 注意:challenge每次认证…

【C++】list基本接口+手撕 list(详解迭代器)

父母就像迭代器&#xff0c;封装了他们的脆弱...... 手撕list目录&#xff1a; 一、list的常用接口及其使用 1.1list 构造函数与增删查改 1.2list 特殊接口 1.3list 排序性能分析 二、list 迭代器实现&#xff08;重点难点&#xff09; 关于迭代器的引入知识&#xff1a…

项目管理入门指南:如何快速上手?

面对复杂的项目任务&#xff0c;如何入手项目管理呢&#xff1f;在项目管理过程中需要面对许多繁杂的问题以及复杂的流程&#xff0c;还涉及到与团队成员的沟通协作。如果单单依靠人的注意力与记忆&#xff0c;可能没有办法兼顾多个方面。一个靠谱好用的项目管理工具可以帮助您…

HTTPS建立连接的过程

HTTPS 协议是基于 TCP 协议的&#xff0c;因而要先建立 TCP 的连接。在这个例子中&#xff0c;TCP 的连接是在手机上的 App 和负载均衡器 SLB 之间的。 尽管中间要经过很多的路由器和交换机&#xff0c;但是 TCP 的连接是端到端的。TCP 这一层和更上层的 HTTPS 无法看到中间的包…

如何正确方便的理解双指针?力扣102 (二叉树的层序遍历)

双指针&#xff0c;顾名思义就是指针的指针。 在此之前我们需要先理解单指针 &#xff08;简称为指针&#xff09;。指针很简单&#xff0c;直接上例子&#xff1a;例&#xff1a;现有两个变量&#xff0c;a10,b20. 要求&#xff1a;交换他们的值&#xff0c;输出的结果应为a20…