首页 > 其他分享 >SpringCloudAliBaBa Seata学习

SpringCloudAliBaBa Seata学习

时间:2024-01-24 13:24:10浏览次数:20  
标签:事务 Seata 协调者 学习 阶段 提交 SpringCloudAliBaBa 参与者 分布式

SpringCloudAliBaBa 学习

服务的注册与发现

分布式事务

使用场景 同一个事务对两个数据库操作,事务肯定是会失效的 因为一个事务就是一个数据库连接,不同的连接就是不同的事务

Seata 是什么?

Seata是一款分布式事务解决方案,用AT模式是阿里推荐的
事务模式:TCC、SAGA、XA

常见分布式事务解决方案

1、seata 阿里分布式框架
2、消息队列
3、saga
4、XA

这四种都是 两阶段(2PC)的协议:完成整个分布式事务需要两个步骤完成

2PC 协议?

预处理Prepare
参与方 数据库或应用

提交Commit

处理流程:一、预处理

询问:协调者向各个参与者 发起询问 是否可以执行事务操作,然后等待各个事务响应
执行:各个参与者收到协调者的事务请求后,执行事务操作,并将undo、redo信息 记录在事务日志表中
预处理sql执行任务是否满足条件(为什么这样设计:1、提交的话 对数据覆盖)
响应:如果参与者成功执行了事务并写入Undo、Redo信息,则向协调者返回yes响应,当然参与者也可能宕机 不响应。如果响应为No,则协调者触发回滚

二、提交/回滚机制

commit通知:请求协调者向所有参与者发送了Commit请求
事务提交: 参与者收到commit请求后,执行事务提交、提交完成后释放事务执行期间占用的所有资源
反馈结果:参与者执行事务提交后向协调者发送Ask响应(没用100%的成功率)
完成事务:接收到所有参与者的Ack响应后,完成事务提交

2PC的问题

1、参与者在等待协调者发送指令时 其实是在等待其他参与者的响应。在此过程中其参与者是不能做其他操作的 也就是阻塞了
2、协调者可能会挂掉
3、数据不一致:如果参与者之一宕机,则无法向协调者发送消息 就无法判断事务成功失败

AT协议(Auto Transaction)

AT 模式是一种无侵入的分布式事务解决方案、我们只需要编业务SQL就行
一阶段:
Setta会拦截"业务SQL",提取元数据,在数据被更新前,update user set name ="李五" where name ="李四"
将其保存为befor image(select * from user where nbame ='李四'。
再业务数据更新之后,再将其保存为"after image" 最后生成行锁。以上操作全部在一个数据库内完成,保证操作的原子性
二阶段:提交
提交的话 因为业务sql在阶段一已经提交至数据库,所以seata框架只需要将保存的快照数据和行锁删掉完成数据清理就行了
回滚:
数据校验:after image 和数据库对比(防止脏数据)
还原数据:before image -> 逆向SQL ->数据还原
删除中间数据:见提交

TCC模式

特点
1、侵入较强
2、在整个过程中基本上没有锁 性能较强
TCC框架: BeyeTCC、TCC-transaction

订单服务
阶段一:中间事务协调->try(比如原本修改订单状态为已完成,这里修改为"下单中" 进行锁定防止其他线程侵占)
阶段二:try->confirm() try没问题->入库把状态改为真实状态 已完成
阶段三:cancel 回滚 状态改为 未支付

库存服务:
阶段一:协调方调用try 修改库存熟练
阶段二:如果操作成功-> 进行真实提交
阶段三 如果回滚:则设置恢复上锁的资源数量

可靠消息的最终一致性方案(RocketMQ)

订单服务:
阶段一:1、try:sendMQ("预备消息")-> RocketMQ
阶段二:1、修改订单状态2、senCommit("发送确认消息")->RocketMq -> 扣减库存
如果确认消息commit发送失败,RocketMq对服务进行回查 如果回查15次后没有回应则 删除消息(对该消息不进行消费)。如果库存扣减失败 也会进行消息的重试15次。如果失败则通知我们手动补偿
阶段三:

标签:事务,Seata,协调者,学习,阶段,提交,SpringCloudAliBaBa,参与者,分布式
From: https://www.cnblogs.com/czh4869/p/17984463

相关文章

  • 寒假怎么制定学习计划高效?可以给自己制定学习计划的软件
    随着寒冬的降临,寒假也随之而至。对于中小学生和大学生们来说,这是一个放松身心、挖掘兴趣、提升学业的黄金时期。然而,众多学子纷纷表示,寒假在家中往往面临太多诱惑,难以按时完成每天的学习目标。那么如何应对这个问题呢?一款智能的学习计划制定软件或许可以成为解决之道。对于那些......
  • scikit-learn.datasets 机器学习库
    scikit-learn是一个用于Python的机器学习库,提供了大量用于数据挖掘和数据分析的工具。以下是对这些函数和方法的简要描述:clear_data_home:清除数据集目录的内容。dump_svmlight_file:将数据集保存为SVMLight格式的文件。fetch_20newsgroups:下载20个新闻组的文本数据集。f......
  • 云计算学习day2
    第二天学习内容为讲解了Linus系统的分区以及命令的含义以及分别有那些命令首先为分区,linus系统的分区为三部分,分别为:/(根)、/boot、swap:/‘第一个文件夹’想进入到linux系统必须要有根,根分区是最重要的分区/boot存放启动引导文件的swap把硬盘上的一部......
  • 某信息安全研究机构:打造创新人才学习平台,增强企业数字化转型内生安全动力
    某信息安全研究机构是该领域具有重要影响力的研究咨询与决策支撑机构,是保障信息安全的重要机构。该信息安全研究机构聚焦安全主业,加强特色智库建设,为经济高质量发展提供智力支持和决策参考。同时,不断强化信息安全综合保障能力、关键软件产业生态促进能力,加强制度建设和合规管理,提高......
  • # WinDbg学习一(入门)
    前言一直在零零散散的摸索WinDbg知识,但是总是不成体系,所以下定决心整理出来。简介WinDbg是一个调试器,可用于分析故障转储、调试实时用户模式和内核模式代码,以及检查CPU寄存器和内存。那么为什么不用VS呢,一个是VS安装在开发环境上,主要用于源码级调试,生产环境调试比较困难,另外......
  • MarkDown学习
    Markdown学习标题三级标题四级标题字体hello,World!引用选择狂神说java分割线图片![截图](C:\Users\chenk\Pictures\Screenshots\屏幕截图2024-01-24070616.png)超链接[点击跳转到](博客园-搜索(bing.com))列表ACABC​表格......
  • JAVA学习笔记--输出HelloWorld
    HelloWorld!写出人生第一个代码~随便新建一个文件夹用于存放代码新建一个Java文件新建一个名为Hello的txt文件或其他文本文件,将后缀名改为.java注意:如果系统没有显示文件后缀名,则需要手动打开在Hello.java文件中编写以下代码:publicclassHello{ publicstaticvoi......
  • JAVA学习笔记--JDK安装及环境变量配置
    Java开发环境搭建卸载JDK找到JDK的安装路径,删除JDK的整个文件夹删除JAVA_HOME(右击我的电脑-->属性-->高级系统设置-->环境变量,即可找到JAVA_HOME)删除path下关于java的目录在终端输入java-version,若显示'java'不是内部或外部命令,也不是可运行程序或批处理文件,则成......
  • php入门学习-4
      1、文件操作函数     (1)php访问文件或文件夹相关函数      filetype()//可以输出相关文件类型,如:dir/file/link        e.g.        echofiletype('C:\WINDOWS');//dir        echof......
  • JAVA学习笔记--常见的Dos命令
    基本的Dos命令打开cmd的方法以管理员的身份打开:开始--->命令提示符(Win11)Win键+R-->输入cmd打开控制台(推荐使用)在任意文件夹下,按住shift键+鼠标右键点击,在此处打开命令行窗口资源管理器的地址栏前面加上cmd路径(注意:cmd后有空格)常见的Dos命令##盘符切换输入想要切换到......