SpringCloud-高级篇(八)

(1)TCC模式

前面学了XA和AT模式,这两种模式最终都能实现一致性,和隔离性,XA是强一致,AT是最终一致,隔离性呢XA是在第一阶段不提交,基于事务本身的特性来完成隔离,AT则是加了全局锁,锁定资源去隔离事务,本质上来看这两种都是加锁来实现的,只要加了锁都会有性能的损耗,如果追求的是极致的性能,就需要使用其他的办法,TCC        模式就是性能的体现,他不需要去加锁,

TCC是基于人工编码来实现的,不想AT模式自动实现的,在第一阶段形成快照,二阶段才能恢复,它多了一个生成快照的逻辑,性能有损耗,这一点TCC胜过了AT模式

成功,扣减冻结金额 -资源预留

回滚

做反向操作,冻结金额减三十,余额加三十

可以看到TCC模式,在做了在第一阶段完成了资源预留之后,第二阶段不管是Confirm还是Cancel都是在操作自己预留的这份资源,就导致了TCC跟AT模式有很大的区别

在第一阶段,两种模式都是个提交各自的事务,很快释放数据库锁,在性能上都非常的好,在第一阶段都会有有可能成功,有可能失败,造成数据不一致,只有在第二阶段完成了Confirm和Cancel之后才有可能才能保证数据的最终一致,它是最终一致,会有中间状态

AT模式是需要加锁去实现隔离的,需要在第一阶段跟第二阶段持有全局锁在一二阶段之间其他事务是不能操作这个资源的,从而确保安全,在TCC模式下是不需要隔离的,因为在第一阶段每个事务冻结的金额是不一样的,每个事务回滚还是提交操作的都是本事务自己冻结余额,不会影响,不需要加锁第二阶段各自操作各自预留的资源,互不影响,TCC模式不需要加锁,就实现了隔离,比AT模式好了很多很多

(2)TCC案例

并不是所有的事务都适合TCC模式来实现,想下单的逻辑,是新增的逻辑,怎么去资源预留,它不适合TCC模式,用AT模式就很好,第一阶段新增了,第二阶段回滚,另外一个事务,它也要做新增它跟前一个事务没有关系,扣减库存的服务可以用ACC模式来实现,我们这里演示金额扣减服务

幂等性我们有一个业务接口,你调用我一次也好多次也好,最终达成的效果是一致的,不会因为重复调用出现问题,这叫做幂等性

怎么避免业务悬挂呢,在执行try的时候判断是否回滚过,回滚过try就不能够执行

判断执行空回滚呢?在执行cancel的时候判断try是否执行了,try没有执行,做空回滚

需要在数据库里记录当前事务的状态当前的事务状态在try状态啊还是confirm状态啊,cancel状态啊,只有知道事务的状态才能做空回滚和避免业务悬挂

新建表:冻结金额表

BussinessActionContextParameter注解:这个注解标记的参数将来放到一个上下文对象里BussinessActionContext,通过这个对象都可以拿到这个参数

创建新的接口:AccountTCCService接口:

创建余额表:用它表示资源的预留,锁定,事务状态

实体类:

Mapper 

 

创建实现类:

用户余额表:中的money字段添加了using 表示没有负号,这个余额不会扣成负数,当扣成负数时会直接报错,事务自动回滚,因此余额不用做判断了

所以在方法try中直接扣除余额,不会做余额判断了

 

 修改Try在其中做悬挂处理

 

Confirm逻辑:

回滚:userID Money可以从加入到全局的参数中获取,也可以查询数据库从数据中获取

修改回滚,在其中做回滚判断,和幂等处理:

这里的userID从全局参数中获取,然后再toString一下


 

修改Controller:

修改成AccountTCCService 

重启服务:

使用Postman发送请求:发送正确的参数

库存表从6到4 

订单多了一条:

余额减200:

余额冻结表:没有数据,因为操作是正确的 

异常数据:

库存没变: 

订单没有增加: 

余额没变:

余额冻结表多了一条记录,state为2回滚状态 

(3)Saga模式

Saga最大的缺点没有隔离性,事务与事务之间有可能出现脏写的一二阶段之间,既没有全局锁,也没有冻结资源,它是由隔离的安全问题的

它会逐个的去执行事务,在这个流程中只有有事务出现问题它会反向依次执行补偿逻辑,从而保证整个事务的状态一致性,典型的分阶段提交

事务执行是可以基于事件驱动的,一个事件完成执行下一个事件,事件驱动好处是吞吐能力比较强,他不会阻塞和等待事件到了就去干某一键事情 ,但是事件什么时候去执行,时间时不确定的,时效性没有那么强

这种长事务的解决方案,时效性比较差一些,比较适合用于事务跨度比较大的业务,比如跨银行的业务调用啊转账等等,业务比较复杂的场景,一般情况下用不到

AT用的最多,TCC和XA选做一些补充就够了

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

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

相关文章

uniGUI学习之UniTreeview

UniTreeview中能改变一级目录的字体和颜色 function beforeInit(sender, config) { ID"#"config.id; Ext.util.CSS.createStyleSheet( ${ID} .x-tree-node-text{color:green;font-weight:800;} ${ID} .x-tree-elbow-line ~ span{color:black;font-weight:400;} ); }

uniGUI学习之UniHTMLMemo1富文本编辑器

1]系统自带的富文本编辑器 2]jQueryBootstarp富文本编辑器插件summernote.js 1]系统自带的富文本编辑器 1、末尾增加<p> 2、增加字体 3、解决滚屏问题 4、输入长度限制问题 5、显示 并 编辑 HTML源代码(主要是图片处理) 1、末尾增加<p> UniHTMLMemo1.Lines…

【MySQL】启动 和 连接 MySQL

启动停止 mysql安装成功后在cmd输入 net start mysql80 //启动 net stop mysql80 //停止 mysql连接 方式1. 通过客户端去连接 方式2.使用cmd去连接 描述&#xff1a;-u是指定 用户 -p是指定密码 mysql -u root -p password

NVM下载和安装NodeJS教程(环境变量配置)

前言:一个公司很多项目,可能每个项目node版本要求不一样,导致每次切换项目,你要重新下载node,非常麻烦,这个时候,就有了nvm,非常的方便实用,也是程序员必备. 1.nvm是什么? nvm全英文也叫node.js version management&#xff0c;是一个nodejs的版本管理工具。nvm和n都是node.…

基于java+swing+mysq学生成绩管理系统(含课程报告)

基于javaswingmysq学生成绩管理系统_含课程报告 一、系统介绍二、功能展示三、项目相关3.1 乱码问题3.2 如何将GBK编码系统修改为UTF-8编码的系统&#xff1f; 四、其它1.其他系统实现 五、源码下载 一、系统介绍 本系统使用 Swing MySQL IntelliJ IDEA 开发。为管理人员提供…

Mac brew install youtube-dl 【 youtube 下载工具:youtube-dl 安装】

文章目录 1. 简介2. 预备3. 安装4. 命令5. 测试 1. 简介 youtube-dl - 从youtube.com或其他视频平台下载视频 https://github.com/ytdl-org/youtube-dl 2. 预备 安装并配置 git安装 brew 3. 安装 MacBook-Pro ~ % brew install youtube-dl Warning: youtube-dl has been …

蓝桥杯专题-真题版含答案-【国庆星期日】【三色棋】【蒙地卡罗法求 PI】【格雷码(Gray Code)】

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列ChatGPT和AIGC &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分…

JVM学习之类加载子系统

类加载子系统 类加载子系统负责从文件或者网络中加载Class文件&#xff0c;class文件在开头有特定的标识 ClassLoader只负责class文件的加载&#xff0c;是否可运行是执行引擎决定的 加载的类信息放在方法区。除了类信息之外&#xff0c;方法区也会放运行时常量池&#xff0c…

TCP报文头(首部)详解

本篇文章基于 RFC 9293: Transmission Control Protocol (TCP) 对TCP报头进行讲解&#xff0c;部分内容会与旧版本有些许区别。 TCP协议传输的数据单元是报文段&#xff0c;一个报文段由TCP首部&#xff08;报文头&#xff09;和TCP数据两部分组成&#xff0c;其中TCP首部尤其重…

基于EasyExcel的数据导入导出

前言&#xff1a; 代码复制粘贴即可用&#xff0c;主要包含的功能有Excel模板下载、基于Excel数据导入、Excel数据导出。 根据实际情况修改一些细节即可&#xff0c;最后有结果展示&#xff0c;可以先看下结果&#xff0c;是否是您想要的。 台上一分钟&#xff0c;台下60秒&a…

【数据在内存中的存储】

目录 整数在内存中的存储大小端字节序和字节序判断浮点数在内存中的存储 1. 整数在内存中的存储 整数的二进制表示方法有三种: 原码、反码和补码 三种表示方法均有符号位和数值位两部分&#xff0c;符号位0表示“正”,1表示"负",而数值位最高的一位被当做符号位,剩…

《工程数值计算Python教程》笔记

文章目录 [toc]第一章&#xff1a;绪论 1.1 1.1 1.1|数值计算在工程科学中的重要性 1.2 1.2 1.2|数值计算方法 1.3 1.3 1.3|程序设计盒图计算方法的选取减少运算次数避免相近的数相减 1.4 1.4 1.4|误差的来源、表示及传递误差的来源和分类模型误差观测误差截断误差舍入误差 误差…

RabbitMQ消息顺序性保障

RabbitMQ 没有属性设置消息的顺序性&#xff0c;只能设置消息的优先级&#xff0c;因此消息顺序性保障只能在 consumer 上实现 场景分析&#xff1a; 生产者向 RabbitMQ 里发送了三条数据&#xff0c; 顺序依次是 data1-> data2 -> data3&#xff0c;压入的是一个内存…

基于vue+element-plus+echarts制作动态绘图页面(柱状图,饼图和折线图)

前言 我们知道echarts是一个非常强大的绘图库&#xff0c;基于这个库&#xff0c;我们可以绘制出精美的图表。对于一张图来说&#xff0c;其实比较重要的就是配置项&#xff0c;填入不同的配置内容就可以呈现出不同的效果。 当然配置项中除了样式之外&#xff0c;最重要的就是…

Stable Diffusion 微调及推理优化实践指南

随着 Stable Diffsuion 的迅速走红&#xff0c;引发了 AI 绘图的时代变革。然而对于大部分人来说&#xff0c;训练扩散模型的门槛太高&#xff0c;对 Stable Diffusion 进行全量微调也很难入手。由此&#xff0c;社区催生了一系列针对 Stable Diffusion 的高效微调方案&#xf…

Qt之QNetworkAccessManager 从本地和内存中上传数据到Http服务器

简述 接连做了好几个服务器的项目&#xff0c;例如文件传输用的Ftp和对象存储服务器(Object Storage Service)&#xff0c;简单的信息传输用的WebServer&#xff0c;之前也有用过HttpServer不过都和WebServer一样简单的调用接口提交数据并没有上传过文件&#xff0c;正好趁这次…

力扣LCR 130. 衣橱整理(DFS 解法)

Problem: LCR 130. 衣橱整理 文章目录 题目描述思路解题方法复杂度Code 题目描述 思路 首先该问题可以归纳为一类遍历二维矩阵的题目&#xff0c;此类中的一部分题目可以利用DFS来解决&#xff0c;具体到本题目&#xff1a; 我们可以利用一个布尔类型的二维数组记录我们已经访…

no module named ‘xxx‘

目录结构如下 我想在GCNmodel的model里引入layers的GraphConvolution&#xff1a;from GCNmodel.layers import GraphConvolution&#xff0c;但这样却报错no module named GCNmodel&#xff0c;而且用from layers import GraphConvolution也不行。然后用sys.path.appen(xxx)…

selenium-grid4.3.0两种模式记录

selenium-grid4.3.0两种模式记录 本文运行&#xff0c;需要提前配置好Java11以及安装好Chrom、Firefox、Safari其中一个浏览器&#xff0c;如果是Chrom、Firefox需要下载对应版本的驱动&#xff0c;并给 webdriver 配置环境变量&#xff0c;Safari浏览器Mac系统会自带&#xf…

使用下载代替物理串口输出-STM32 Debug (printf) Viewer

使用下载代替物理串口输出-STM32 Debug 硬件要求配置方法代码要求打印输出结果 硬件要求 STM32的PB9、PB10引脚的串口1通常用作其他功能使用后&#xff0c;无法通过printf()函数打印输出想要调试输出查看变量或调试信息。现已使用另外一种方法实现printf()函数打印输出。 ST…