Seata的 TCC 模式
目录
概述
使用
依赖与配置
代码
概述
TCC 模式是一种侵入式的分布式事务解决方案,它不依赖于数据库的事务,而是要求开发者自定义完成 预提交、提交、回滚的方法逻辑。因此,它是一个种偏 复杂、灵活、有侵入性 的分布式事务处理方案。
Demo
这里附上seata的学习代码demo,开箱即用。包含AT/TCC/XA等模式的使用案例https://download.csdn.net/download/lmj3732018/88864802
使用
依赖与配置
Seata的TCC模式依赖和配置与AT模式完全一致,只是TCC模式不需要定义 undo_log 数据库表,这里不再赘述。
代码
1. 在使用时,我们需要在多个本地事务分支的外层使用 @GlobalTransactional 开启全局事务
@Override
@GlobalTransactional(name="createOrder",rollbackFor=Exception.class)
public Order saveOrder(OrderVo orderVo) {log.info("=============用户下单=================");log.info("当前 XID: {}", RootContext.getXID());//获取全局唯一订单号 测试使用Long orderId = UUIDGenerator.generateUUID();//阶段一: 创建订单Order order = orderService.prepareSaveOrder(orderVo,orderId);//扣减库存storageFeignService.deduct(orderVo.getCommodityCode(), orderVo.getCount());//扣减余额accountFeignService.debit(orderVo.getUserId(), orderVo.getMoney());return order;
}
2. 定义各个本地事务分支的预提交、提交、回滚方法
OrderService 接口
/**** 通过 @LocalTCC 这个注解,RM 初始化的时候会向 TC 注册一个分支事务。*/
@LocalTCC
public interface OrderService {/*** TCC的try方法:保存订单信息,状态为支付中** 定义两阶段提交,在try阶段通过@TwoPhaseBusinessAction注解定义了分支事务的 resourceId,commit和 cancel 方法* name = 该tcc的bean名称,全局唯一* commitMethod = commit 为二阶段确认方法* rollbackMethod = rollback 为二阶段取消方法* BusinessActionContextParameter注解 传递参数到二阶段中* useTCCFence seata1.5.1的新特性,用于解决TCC幂等,悬挂,空回滚问题,需增加日志表tcc_fence_log*/@TwoPhaseBusinessAction(name = "prepareSaveOrder", commitMethod = "commit", rollbackMethod = "rollback", useTCCFence = true)Order prepareSaveOrder(OrderVo orderVo, @BusinessActionContextParameter(paramName = "orderId") Long orderId);/**** TCC的confirm方法:订单状态改为支付成功** 二阶段确认方法可以另命名,但要保证与commitMethod一致* context可以传递try方法的参数** @param actionContext* @return*/boolean commit(BusinessActionContext actionContext);/*** TCC的cancel方法:订单状态改为支付失败* 二阶段取消方法可以另命名,但要保证与rollbackMethod一致** @param actionContext* @return*/boolean rollback(BusinessActionContext actionContext);
}
OrderServiceImpl实现类
@Service
@Slf4j
public class OrderServiceImpl implements OrderService {@Autowiredprivate OrderMapper orderMapper;@Override@Transactional(rollbackFor = Exception.class)public Order prepareSaveOrder(OrderVo orderVo,@BusinessActionContextParameter(paramName = "orderId") Long orderId) {// 保存订单Order order = new Order();order.setId(orderId);order.setUserId(orderVo.getUserId());order.setCommodityCode(orderVo.getCommodityCode());order.setCount(orderVo.getCount());order.setMoney(orderVo.getMoney());order.setStatus(OrderStatus.INIT.getValue());Integer saveOrderRecord = orderMapper.insert(order);log.info("保存订单{}", saveOrderRecord > 0 ? "成功" : "失败");return order;}@Overridepublic boolean commit(BusinessActionContext actionContext) {// 获取订单idlong orderId = Long.parseLong(actionContext.getActionContext("orderId").toString());//更新订单状态为支付成功Integer updateOrderRecord = orderMapper.updateOrderStatus(orderId, OrderStatus.SUCCESS.getValue());log.info("更新订单id:{} {}", orderId, updateOrderRecord > 0 ? "成功" : "失败");return true;}@Overridepublic boolean rollback(BusinessActionContext actionContext) {//获取订单idlong orderId = Long.parseLong(actionContext.getActionContext("orderId").toString());//更新订单状态为支付失败Integer updateOrderRecord = orderMapper.updateOrderStatus(orderId, OrderStatus.FAIL.getValue());log.info("更新订单id:{} {}", orderId, updateOrderRecord > 0 ? "成功" : "失败");return true;}}
在 storageFeignService 及 accountFeignService的远程方法中也是以同样的方式定义上述三个方法。
相关文章:
![](https://www.ngui.cc/images/no-images.jpg)
Seata的 TCC 模式
目录 概述 使用 依赖与配置 代码 概述 TCC 模式是一种侵入式的分布式事务解决方案,它不依赖于数据库的事务,而是要求开发者自定义完成 预提交、提交、回滚的方法逻辑。因此,它是一个种偏 复杂、灵活、有侵入性 的分布式事务处理方案。 De…...
![](https://www.ngui.cc/images/no-images.jpg)
Vue全局指令防止重复点击(等待请求)
继《vue之全局请求loading》之后,总觉得全局loading有时候不太…友好,所以总想将loading加到被点击的元素上面,于是乎就想到了点击事件与请求方法相关联,本想重写组件的click方法,但是这样对组件的影响太大,…...
![](https://img-blog.csdnimg.cn/direct/665d89c3a38041aa800d170baf6e8605.png)
数据库索引面试的相关问题
查看索引的执行计划 索引失效的情况 1、索引列上做了计算,函数,类型转换等操作。索引失效是因为查询过程需要扫描整个索引并回表。代价高于直接全表扫描。 Like匹配使用了前缀匹配符“%abc” 字符串不加引号导致类型转换。 原因: 常见索…...
![](https://www.ngui.cc/images/no-images.jpg)
Spring启动生命周期
Spring Boot 生命周期详解 Spring Boot 应用程序的生命周期包含几个阶段,每个阶段都有特定的事件和钩子,允许开发者在应用程序的不同生命周期阶段插入自定义逻辑。以下是 Spring Boot 生命周期的主要阶段和对应的事件: 准备阶段:…...
![](https://www.ngui.cc/images/no-images.jpg)
瑞芯微RK3568芯片介绍
RK3568简介 RK3568是一款由瑞芯微电子有限公司(Rockchip Electronics Co. Ltd)推出的高性能多媒体处理器,定位于中高端市场,被广泛应用于平板电脑、多媒体盒子、电子看板和工业控制等领域。以下是对这款芯片的简要介绍࿱…...
![](https://img-blog.csdnimg.cn/direct/bb27aa9a846143708077bcb3f1fcb2bb.png)
15.一种坍缩式的简单——组合模式详解
当曾经的孩子们慢慢步入社会才知道,那年味渐淡的春节就像是疾驰在人生路上的暂停键。 它允许你在隆隆的鞭炮声中静下心来,瞻前顾后,怅然若失。 也允许你在寂静的街道上屏气凝神,倾听自己胸腔里的那团人声鼎沸。 孩子们会明白的&am…...
![](https://img-blog.csdnimg.cn/direct/c7e8219839364a079dd86a1205adfb25.png)
Node.js的debug模块源码分析及在harmonyOS平台移植
Debug库 是一个小巧但功能强大的 JavaScript 调试工具库,可以帮助开发人员更轻松地进行调试,以便更快地发现和修复问题。它的主要特点是可以轻松地添加调试日志语句,同时在不需要调试时可以轻松地禁用它们,以避免在生产环境中对性…...
![](https://img-blog.csdnimg.cn/direct/dbf45706ad9342c7a41701acb51881a6.png)
【Crypto | CTF】BUUCTF RSA2
天命:密码学越来越难了,看别人笔记都不知道写啥 天命:莫慌,虽然我不会推演法,但我可以用归纳法 虽然我不知道解题的推演,但我可以背公式啊哈哈哈 虽然我不会这题,但是我也能做出来 公式我不知…...
![](https://img-blog.csdnimg.cn/direct/c36e320947ac425bb3a2078ddceaa6e1.png)
单片机学习笔记---红外遥控红外遥控电机调速(完结篇)
目录 低电平触发中断和下降沿触发中断的区别 红外遥控 Int0.c Int.h Timer0.c Timer0.h IR.c IR.h main.c 红外遥控电机调速 Timer1.c Timer.h Motor.c Motor.h main.c 上一节讲了红外发送和接收的工作原理,这一节开始代码演示! 提前说…...
![](https://img-blog.csdnimg.cn/direct/fb659bcba0844f5c960750d79f47b798.png)
Linux第62步_备份移植好的所有的文件和文件夹
1、备份“my-tfa”目录下所有的文件和文件夹 1)、打开终端 输入“ls回车”,列出当前目录下所有的文件和文件夹 输入“cd linux回车”,切换“linux”目录下 输入“ls回车”,列出当前目录下所有的文件和文件夹 输入“cd atk-mp1/回车”&am…...
![](https://www.ngui.cc/images/no-images.jpg)
【xss跨站漏洞】xss漏洞前置知识点整理
xss漏洞成因 xss漏洞是一种前端javascript产生的漏洞。 我们网站基本都是会用到javascript编写一些东西,浏览器也能直接识别javascript。 如果有一个地方能够输入文字,但是他又没有过滤你的输入,那么自己或者他人看到你输入的javascript代…...
![](https://www.ngui.cc/images/no-images.jpg)
mac下mysql 常用命令
mysql启动命令 在Mac OS X启动和停止MySQL服务的命令, 启动MySQL服务 sudo /usr/local/mysql/support-files/mysql.server start 停止MySQL服务 sudo /usr/local/mysql/support-files/mysql.server stop 重启MySQL服务 sudo /usr/local/mysql/support-files/mys…...
![](https://www.ngui.cc/images/no-images.jpg)
2.21号qt
1.QMainWindow中常用的类 继承于QMainWindow类,原因该类提供了QWidget没有提供的成员函数。 菜单栏、工具栏、状态栏、浮动窗口(铆接部件)、核心部件 1.1 菜单栏 QMenuBar //创建菜单栏 QMenuBar 最多只能有一个 QMenuBar *mbar menu…...
![](https://www.ngui.cc/images/no-images.jpg)
什么是MVVM?MVC、MVP与MVVM模式的区别?
MVVM(Model-View-ViewModel)是一种软件架构模式,用于将用户界面(View)与业务逻辑(Model)分离,并通过ViewModel来连接两者。MVVM的目标是实现可测试性、可维护性和可复用性。 MVC&am…...
![](https://img-blog.csdnimg.cn/direct/938c240e52fb464ea550193e5db49452.png)
ElementUI组件的安装和使用
Element UI 是一款基于 Vue 2.0 的桌面端组件库,主要用于快速构建网站的前端部分。它提供了丰富的组件,如按钮、输入框、表格、标签页等,以及一些布局元素,如布局容器、分割线等。Element UI 的设计风格简洁,易于上手&…...
![](https://img-blog.csdnimg.cn/direct/227183e314864c209cbc5c373b0af5b6.png)
Laravel01 课程介绍以及Laravel环境搭建
Laravel01 课程介绍 1. Laravel2. mac开发环境搭建(通过Homebrew)3. 创建一个项目 1. Laravel 公司中面临着PHP项目与Java项目并行,所以需要我写PHP的项目,公司用的框架就是Laravel,所以在B站上找了一门课学习。 Laravel中文文档地址 https…...
![](https://img-blog.csdnimg.cn/direct/b9175b4a2af448d1a80b2cb795429bb5.png)
面试redis篇-03缓存击穿
原理 缓存击穿:给某一个key设置了过期时间,当key过期的时候,恰好这时间点对这个key有大量的并发请求过来,这些并发的请求可能会瞬间把DB压垮 解决方案一:互斥锁 解决方案二:逻辑过期 提问与回答 面试官 :什么是缓存击穿 ? 怎么解决 ? 回答: 缓存击穿的意思…...
![](https://www.ngui.cc/images/no-images.jpg)
k8s容器以及基础设施优化
1.硬件系统选型:宿主机通用配置16c/32GB/4网卡队列 2.os优化:单机支持百万tcp并发,/etc/sysctl.conf,/etc/security/limits.conf 3.k8s&容器层优化:性能优化initContainer 4.kube-dns优化:增大--cache-size,设置…...
![](https://img-blog.csdnimg.cn/direct/9a6a5848035245b4a6cb235450f35e1c.png)
蓝桥杯备赛系列——倒计时50天!
蓝桥杯备赛系列 倒计时50天! 前缀和和差分 知识点 **前缀和数组:**假设原数组用a[i]表示,前缀和数组用sum[i]表示,那么sum[i]表示的是原数组前i项之和,注意一般用前缀和数组时,原数组a[i]的有效下标是从…...
![](https://img-blog.csdnimg.cn/direct/e6784bd5aea948388e4512051e43b357.png)
jenkins配置ssh的时候测试连接出现Algorithm negotiation fail
背景:当jenkins升级后,同时ssh插件也升级,测试ssh连接的时候 出现的问题: com.jcraft.jsch.JSchAlgoNegoFailException: Algorithm negotiation fail: algorithmName"server_host_key" jschProposal"ecdsa-sha2-n…...
![](https://img-blog.csdnimg.cn/38f316959b534b30bd52a8a084ce5f9a.png)
思维模型整合
思维模型整合 4P--- 4C思考模型能力圈模型 4P— 4C思考模型 在竞争激烈的今天,每个赛道都有众多可以为客户提供相同价值的对手,而赛道中的佼佼者之所以能打败大部分人,可能并不是他们能比别人更能讨好大众,而是因为在这个赛道它有…...
![](https://img-blog.csdnimg.cn/direct/fc2c121cebc04bd3ad4ee8c99f4d771f.png)
代理模式笔记
代理模式 代理模式代理模式的应用场景先理解什么是代理,再理解动静态举例举例所用代码 动静态的区别静态代理动态代理 动态代理的优点代理模式与装饰者模式的区别 代理模式 代理模式在设计模式中是7种结构型模式中的一种,而代理模式有分动态代理&#x…...
![](https://www.ngui.cc/images/no-images.jpg)
手机中有哪些逆向进化的功能
手机中有哪些逆向进化的功能?逆向进化是指明明很优秀的很方便的功能,却因为成本或者其他工业原因莫名其妙地给取消了。 逆向进化1:可拆卸电池-变为不可拆卸电池。 智能手机为了追求轻薄等原因,所以移除了可拆卸电池功能。将电池…...
![](https://www.ngui.cc/images/no-images.jpg)
LeetCode24.两两交换链表中的节点
参考链接:代码随想录:LeetCode24.两两交换链表中的节点 我这里使用了3个变量进行暴力交换,简单快捷!但是有一点想不明白,return这里只能写dh->next,写返回head就结果不对了!但是后面又想明白了ÿ…...
![](https://img-blog.csdnimg.cn/direct/80e8b10ab1fb45d3a7a9463643f8fed8.png)
Eureka注册中心(黑马学习笔记)
Eureka注册中心 假如我们的服务提供者user-service部署了多个实例,如图: 大家思考几个问题: order-service在发起远程调用的时候,该如何得知user-service实例的ip地址和端口? 有多个user-service实例地址,…...
![](https://img-blog.csdnimg.cn/direct/6f565380c05447b2a0fc7deb32d8a8ee.png)
unity-firebase-Analytics分析库对接后数据不显示原因,及最终解决方法
自己记录一下unity对接了 FirebaseAnalytics.unitypackage(基于 firebase_unity_sdk_10.3.0 版本) 库后,数据不显示的原因及最终显示解决方法: 1. 代码问题(有可能是代码写的问题,正确的代码如下ÿ…...
![](https://www.ngui.cc/images/no-images.jpg)
JWT(JSON Web Token)原理、应用与安全性分析
随着互联网的快速发展,Web应用的安全性越来越受到重视。在众多的安全认证技术中,JSON Web Token(JWT)凭借其简洁、自包含和传输安全的特点,被广泛应用于Web应用的用户身份验证和信息交换。 一、JWT的原理 JWT是一个开…...
![](https://img-blog.csdnimg.cn/direct/0c5a73dc96f54cd68c851f93c5926afe.png)
Redis 缓存(Cache)
什么是缓存 缓存(cache)是计算机中的一个经典的概念在很多场景中都会涉及到。 核心思路就是把一些常用的数据放到触手可及(访问速度更快)的地方,方便随时读取。 这里所说的“触手可及”是个相对的概念 我们知道,对于硬件的访问速度来说,通常…...
![](https://img-blog.csdnimg.cn/direct/d11d747f9e7b47dfa5e6d000858a9836.png)
ChatGPT回答模式
你发现了吗,ChatGPT的回答总是遵循这些类型方式。 目录 1.解释模式 2.类比模式 3.列举模式 4.限制模式 5.转换模式 6.增改模式 7.对比模式 8.翻译模式 9.模拟模式 10.推理模式 1.解释模式 ChatGPT 在回答问题或提供信息时,不仅仅给出…...
![](https://img-blog.csdnimg.cn/direct/740338b4e6a441d6bf043d422d2f46c7.png)
戏曲文化苑|戏曲文化苑小程序|基于微信小程序的戏曲文化苑系统设计与实现(源码+数据库+文档)
戏曲文化苑小程序目录 目录 基于微信小程序的戏曲文化苑系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、微信小程序前台 2、管理员后台 (1)戏曲管理 (2)公告信息管理 (3)公告类型管理…...
![](/images/no-images.jpg)
西安网站推广/网站推广的基本手段有哪些
转载于:https://www.cnblogs.com/6DAN_HUST/archive/2013/01/18/2866932.html...
北京网站优化服务/杭州优化公司哪家好
随着互联网的发展,人们对页面的要求越来越高,不只是功能好用,而且还要颜值高。前端开发人员对于浏览器的滚动条并不陌生,当自带的一些滚动条无法满足我们的审美时,你知道如何用CSS修改浏览器滚动条的样式吗?…...
![](/images/no-images.jpg)
竞网做的网站怎么/宁波seo深度优化平台
动态规划思想是将大问题分解成小问题,然后解决所有的小问题,最后把解组合起来就得到大问题的解。这个和分治法思想很类似,但是这里的小问题是有重叠的,分治处理的小问题都是独立的,有重叠就会有重复计算,为…...
![](/images/no-images.jpg)
乌兰察布做网站的公司/现在阳性最新情况
1、使用参数化SQL语句进行模糊查找的正确方法://定义sql语句string sql "SELECT StudentID,StudentNO,StudentName FROM Student WHERE StudentName like StudentName";//给参数赋值command.Parameters.AddWithValue("StudentName",txtStudent…...
![](/images/no-images.jpg)
花生壳可以做网站吗/关键词搜索量全网查询
Bash具有“可加载”睡眠,支持小数秒,并消除了外部命令的开销:$cd bash-3.2.48/examples/loadables$make sleep && mv sleep sleep.so$enable -f sleep.so sleep然后:$which sleep/usr/bin/sleep$builtin sleepsleep: usage: sleep seconds[.frac…...
![](/images/no-images.jpg)
vultr做网站怎么样/郑州外贸网站推广
这个其实网上很多,一百度一大把,但是网上得都有一个通病导致不成功,我也不知道他们当时是怎们通过的。 前面怎们打开环境变量就不细说了,网上很多。 在添加路径时双击path,j进入编辑页面,然后添加所在python所在的安…...