SpringCloud-高级篇(八)

news2024/11/24 9:44:56

(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.coloradmin.cn/o/1316850.html

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

相关文章

MongoDB表的主键可以重复?!MongoDB的坑

MongoDB表的主键可以重复?! 眼见为实? 碰到一个奇怪的现象, MongoDB的一个表居然有两个一样的_id值! 再次提交时,是会报主键冲突的。那上图,为什么会有两个一样的_id呢? 将它们的…

【halcon深度学习】目标检测的数据准备过程中的一个库函数determine_dl_model_detection_param

determine_dl_model_detection_param “determine_dl_model_detection_param” 直译为 “确定深度学习模型检测参数”。 这个过程会自动针对给定数据集估算模型的某些高级参数,强烈建议使用这一过程来优化训练和推断性能。 过程签名 determine_dl_model_detection…

10 新字符设备驱动文件

一、新字符设备驱动原理 因为 register_chrdev 和 unregister_chrdev 两个函数是老版本驱动文件,现在可以用新字符设备驱动 API 函数。 1. 分配和和释放设备号 使用 register_chrdev 函数注册字符设备的时候只需要给定一个主设备号即可,但是这样会带来两…

【面试】广告优化

a1:点击率公式是什么?点击率低的原因是什么? 点击率点击/曝光,点击率低的原因主要有两点:一是创意不吸引人;二是目标受众不准确/定向过宽不精确,广告曝光给了对产品不感兴趣用户 a2:…

数据库——关系数据的规范化:范式判断【知识点罗列+例题讲解】

知识点罗列: 各种范式之间的关系 1.第一范式1NF: 如果关系模式R中所有的属性都具有原子性,均是不可再分的(一个属性不能再被分解成更小的数据单元),则称R属于第一范式,简称1NF,记作R…

linux常见错误

1.E45: ‘readonly‘ option is set (add ! to override) 首先使用以下命令从Vim编辑器中出来::qa!(强制退出) 接下来,使用sudo vim filename和更高版本::wq 2.Bash script – "/bin/bash^M: bad interpreter: No such file or direc…

yolov5单目测距+速度测量+目标跟踪

要在YOLOv5中添加测距和测速功能,您需要了解以下两个部分的原理: 单目测距算法 单目测距是使用单个摄像头来估计场景中物体的距离。常见的单目测距算法包括基于视差的方法(如立体匹配)和基于深度学习的方法(如神经网…

安捷伦N9020A 是德keysight/N9020A

N9020A信号分析仪自动化和通讯接口: 符合 LXI、SCPI 和 IVI-COM USB 3.0、1000Base-T LAN、GPIB 编程与 PSA、8566/68 和 856x 的远程语言兼容性 通用 X 系列用户界面 / 开放式 Windows 7 操作系统(标准) 将现有的 MXA 从 Windows XP 迁移到…

CAN 五: CAN编程实践

1、CAN基本驱动步骤 (1)CAN参数初始化 工作模式、波特率等函数:HAL_CAN_Init (2)使能CAN时钟和初始化相关引脚 GPIO模式设为复用功能模式函数:HAL_CAN_MspInit(CAN的初始化回调函数) (3)设置过滤器 过滤器的配置函数:HAL_CAN_ConfigFil…

【linux】(ubuntu)下 QT 出现的问题

错误一:Make 运行QT程序以后出现这样的错误。 【解决方法】 我的ubuntu版本是18.04.4, 原因1:没有更换软件源 原因2:没安装相关 软件包 注意:这一步很有可能卡死这一步,所以如果一直卡在这并且进度…

黑马点评01

基础篇-07.Redis命令-数据结构介绍_哔哩哔哩_bilibili 1.NoSQL 非结构化数据库,和sql的区别在于没有数据库表之间的关系(主键外键),一般的存储形式是JSON。每个json里面都存储了该记录的所有数据,所以有一定重复性。 …

总结一些vue3小知识2

1.el-tree-select和el-tree组件报错(有的下拉选项选择不了,一点击就报错,但是有的却能选择,不会报错) 原因:就如同v-for一样,需要添加key才不会出现渲染错误,而el-tree-select和el-tree组件需要…

MySQL数据库 DCL

目录 DCL概述 管理用户 权限控制 DCL概述 DCL英文全称是Data Control Language(数据控制语言),用来管理数据库用户、控制数据库的访 问权限。 管理用户 (1) 查询用户 select * from mysql.user; 查询的结果如下: 其中 Host代表当前用户访问的主机, 如果为localh…

计算机组成原理-指令系统CISC和RISC

文章目录 总览CISC和RISC 总览 CISC和RISC 存储程序就是用一个电路再加上存储部件构成 可访存指令不同 RISC更自由,因为很多函数没有固定,是自己写的 由于CISC各个指令执行时间不一样,要实现指令流水线比较困难 由于CISC可访存指令没有限制…

LVS负载均衡群集,熟悉LVS的工作模式,了解LVS的调度策略以及ipvsadm工具的命令格式

目录 一、什么是群集 群集的作用: 群集的目的是什么 根据群集所针对的目标差异,可分为三种类型 负载均衡群集(LBC)load balance cluster 高可用群集(HAC)high availability cluster 高性能运算群集&a…

【Docker】5. Dockerfile 构建和管理容器化应用程序

▒ 目录 ▒ 🛫 导读开发环境 1️⃣ Dockerfile介绍 基本语法 指令 2️⃣ 实战:Python 的 Flask Web 代码 编译运行 发布到服务器 🛬 文章小结📖 参考资料 🛫 导读 开发环境 版本号描述文章日期2023-12-15操作系统…

Dagger2基本使用2之子组件

一,基本使用,完成一个注入 1,创建作用域 //自定义作用域,作用域只是一个名称,随便起啥名字都可以,这里取一个全局单利的名字 Scope Documented Retention(RUNTIME) public interface GlobalSingleton { }…

LVS负载均衡器(DR模式)+nginx七层代理+tomcat多实例+php+mysql 实现负载均衡以及动静分离、数据库的调用!!!

目录 前言 一、nfs共享存储,为两个节点服务器提供静态网页共享 二、nginx作为lvs的后端节点服务器,完成lo:0网卡配置,以及内核参数设置,还有设置路由表 步骤一:先完成nfs共享存储挂载 步骤二:完成lo:0网…

QT----第三天,Visio stdio自定义封装控件,鼠标事件,定时器,事件分发器过滤器,绘图事件

目录 第三天1 自定义控件封装2 QT鼠标事件3 定时器4 event事件分发器5 事件过滤器6 绘图事件Qpainter 源码:CPP学习代码 第三天 1 自定义控件封装 新建一个QT widgetclass,同时生成ui,h,cpp文件 在smallWidget.ui里添加上你想要的控件并调试大小 回到…

Linux下MySQL的安装部署

MySQL数据库存在多种版本,不同的版本在不同的平台上(OS,也就是操作系统上)安装方式可能有所不同,因此安装时一定要参数官方文档进行安装。 MySQL :: MySQL Documentation 选择需要的MySQL官方提供的不同版本&#xff0…