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.mfbz.cn/a/254451.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python都有什么特性,为什么适合每个人学习?详细解读来了

Python编程语言简介 Python,一种高层次的、解释型的编程语言,以其跨平台性、易读性和灵活性在全球编程界占据了重要的地位。自1991年首次发布以来,Python已经成为了无数程序员和企业的首选语言,尤其是在快速开发和原型设计方面。 …

Ansible:模块1

Ansible: 远程操作主机功能 自动化运维(playbook 剧本 yaml) 是基于python开发的配置管理和应用部署工具。在自动化运维中,现在是一军突起。 Ansible能批量配置,部署,管理上千台主机。类似于xshell的一…

MFC 程序执行流程

目录 MFC 程序启动 MFC 入口函数 程序执行流程总结 在Win32课程中WinMain由程序员自己实现,那么流程是程序员安排,但到了MFC中,由于MFC库实现WinMain,也就意味着MFC负责安排程序的流程。 MFC 程序启动 程序的启动,…

红枣期货个股(红枣期货个股:投资方向分析)

红枣期货个股介绍 红枣是我国传统的绿色健康食品,具有营养丰富、味道独特的特点,深受消费者喜爱。红枣产业链较长,包括种植、采摘、加工、销售等环节,其中期货是红枣产业不可或缺的一环。红枣期货个股作为期货交易市场上的重要投…

mybatis中oracle的sql没走索引导致特别慢(未加jdbcType的)

如果直接跑sql是能走索引很快,在mybatis中不能,可能就是jdbcType的原因。 比如,我有一个属性A,在表里面是VARCHAR2类型,但是在mybatis中的sql是#{a},缺少jdbcTypeJdbcType.VARCHAR,就会导致myba…

risc-v system instruction

ECALL ecall 指令以前叫做 scall,用于执行环境的变更,它会根据当前所处模式触发不同的执行环境切换异常, 用来执行需要更高权限才能执行的功能;简单来说,ecall 指令将权限提升到内核模式并将程序跳转到指定的地址。操作系统内核和应用程序其实…

AD采集卡设计方案:630-基于PCIe的高速模拟AD采集卡

基于PCIe的高速模拟AD采集卡 一、产品概述 基于PCIe的一款分布式高速数据采集系统,实现多路AD的数据采集,并通过PCIe传输到存储计算服务器,实现信号的分析、存储。 北京太速科技,产品固化FPGA逻辑,适配2路…

ShardingSphere-JDBC 和 ShardingSphere-Proxy,你选择哪一个

参考文章 总结: 只使用Java,ShardingSphere-JDBC更好有异构语言的话,ShardingSphere-Proxy 更好混用也挺香

Flink系列之:监控Checkpoint

Flink系列之:监控Checkpoint 一、概览二、概览(Overview)选项卡三、历史记录(History)选项卡四、历史记录数量配置五、摘要信息(Summary)选项卡六、配置信息(Configuration&#xff…

100GPTS计划-AI动漫AnimeArtisan

地址 https://poe.com/AnimeArtisan https://chat.openai.com/g/g-LM6ObVhfF-anime-artisan 测试 风景类: 阳光、蓝天、白云、大海、海滩、森林、瀑布、山峰、雪山 日常类: 睡觉、跑步、学习、工作、做家务、看书、听音乐、运动、购物、煮饭 人物类: 女孩、男孩、老人、儿童…

『 Linux 』重新理解挂起状态

文章目录 🦄 前言新建状态 🐋挂起状态 🐋唤入唤出 🐋进程与操作系统间的联系 🐋 🦄 前言 『 Linux 』使用fork函数创建进程与进程状态的查看中提到了对挂起状态的一个理解; ​ 挂起状态相比于其…

爬虫练习-获取imooc课程目录

代码: from bs4 import BeautifulSoup import requests headers{ User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:94.0) Gecko/20100101 Firefox/94.0, }id371 #课程id htmlrequests.get(https://coding.imooc.com/class/chapter/id.html#Anchor,head…

kubernetes 学习笔记

1. Kubernetes 介绍 1.1 应用部署方式的演变 在部署应用程序的方式上,主要经理了三个时代: 传统部署:互联网早期,会直接将应用程序部署在物理机上。虚拟化部署:可以在一台物理机上运行多个虚拟机,每个虚…

高可用接入层技术演化及集群概述

集群概述 集群的介绍及优势 集群:将多台服务器通过硬件或软件的方式组合起来,完成特定的任务,而这些服务器对外表现为一个整体。集群的优势 高可靠性:利用集群管理软件,当主服务器故障时,备份服务器能够自…

Cesium 加载 Geoserver WMS 图层以及条件查询和切换图层样式

Cesium 加载 Geoserver WMS 图层以及条件查询和切换图层样式 图层样式核心代码完整代码:在线示例 Cesium 加载 Geoserver WMS 图层,在实际项目中常常会遇到,需要对图层进行过滤,这里介绍一下过滤方法。 Cesium Geoserver 图层条件…

AirPodsPro3爆料汇总,2025年发布?

不止是iPhone,苹果的AirPods Pro系列耳机也是非常受用户青睐的一款产品,相信不少果粉都非常期待它的升级换代。 第一代AirPods Pro于2019年10月发布,第二代AirPods Pro于2022年9月发布,按照这个时间线来看的话,第三代A…

《Linux C编程实战》笔记:进程操作之创建进程

进程是一个动态的实体,是程序的一次执行过程。进程是操作系统资源分配的基本单位。 以下是一些概念,我就直接抄书了 进程是操作系统的知识,简单理解的话,你写的代码运行起来算一个进程? 创建进程 每个进程由进程ID号…

在vue项目中,数据已经在页面渲染,但在后续操作时获取不到数据

如下图 产生这个问题的原因 异步问题 如何解决 方法一:可以将其存放在一个setTimeout里面(利用一个极小的延迟来获取数据),如下图 效果 方法二:将操作放入axios里面,如下图

昂首资本发现原油价差这样用,难怪银行这么富

难怪银行这么富,原来是发现一个稳定产生利益的投资策略。虽然这个利润可能看起来比较少。但是昂首资本需要提醒各位投资者的是:首先,这个策略几乎没有风险。第二,这是一个可以复制的投资策略。 下面昂首资本就通过原油的价差进行实…

开发信怎么写回复率高?写外贸邮件的技巧?

如何打造高回复率的开发信?有效的开发信模板推荐? 如何写一封能够引起客户兴趣并提高回复率的开发信变得至关重要。开发信是建立联系、促进销售和扩大业务的关键工具之一。蜂邮EDM将探讨一些关键策略,帮助你提高开发信的回复率,确…
最新文章