Seata入门系列【7】Seata之TCC模式入门案例

news2024/11/27 22:37:24

1 前言

Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。

TCC 与 Seata AT 事务一样都是两阶段事务,它与 AT 事务的主要区别为:

  • TCC 对业务代码侵入严重:每个阶段的数据操作都要自己进行编码来实现,事务框架无法自动处理。

  • TCC 效率更高:不必对数据加全局锁,允许多个事务同时操作数据。

接下来分析下Seata 如何使用TCC 模式。

2 TCC 案例

案例需求:账户服务调用订单和库存服务进行下单操作,保证某个环节异常时,事务能实现全局一致。

2.1 环境搭建

参考Seata 专栏搭建三个测试模块,注意这里不需要undo_log 表。

当前主要组件版本为:

  • spring.boot:2.3.12.RELEASE

  • spring.cloud:Hoxton.SR12

  • spring.cloud.alibaba:2.2.7.RELEASE

  • Nacos : 2.0.3

  • Seata: 1.4.2

  • mybatis-plus: 3.4.2

在这里插入图片描述

2.2 自定义两个阶段处理逻辑

TCC 模式,不依赖于底层数据资源的事务支持:

  • 一阶段 prepare 行为:调用 自定义 的 prepare 逻辑。
  • 二阶段 commit 行为:调用 自定义 的 commit 逻辑。
  • 二阶段 rollback 行为:调用 自定义 的 rollback 逻辑。

因为TCC 需要自定义分支事务处理逻辑,所以我们需要编写一个账户购买商品服务接口,并添加相关注解。

@LocalTCC
public interface AccountTblService extends IService<AccountTbl> {

    /**
     * 执行资源检查及预留操作
     */
    @TwoPhaseBusinessAction(name = "prepareBuy", commitMethod = "commit", rollbackMethod = "rollback")
    Object prepareBuy(@BusinessActionContextParameter(paramName = "userId") String userId, String code, @BusinessActionContextParameter(paramName = "count") Long count);

    /**
     * 全局事物进行提交
     */
    boolean commit(BusinessActionContext actionContext);

    /**
     * 全局事务进行回滚
     */
    boolean rollback(BusinessActionContext actionContext);
}

相关注解说明:

  • @LocalTCC:作用于服务接口上,表示实现该接口的实现类被 seata 来管理,seata 根据事务的状态,自动调用我们定义的方法,如果没问题则调用 Commit 方法,否则调用 Rollback 方法。
  • @TwoPhaseBusinessAction:该注解用在接口的 Try 方法上,name 为 tcc 方法的 bean 名称,需要全局唯一,一般写方法名即可;commitMethod指定事务成功后的commit方法;rollbackMethod 指定事务失败后的rollback方法。
  • @BusinessActionContextParameter: 该注解用来修饰 Try 方法的入参,被修饰的入参可以在 Commit 方法和 Rollback 方法中通过 BusinessActionContext 获取。

编写接口实现类:

@Service
@Slf4j
public class AccountTblServiceImpl extends ServiceImpl<AccountTblMapper, AccountTbl> implements AccountTblService {


    @Autowired
    AccountTblMapper accountTblMapper;
    @Autowired
    OrderClint orderClint;
    @Autowired
    StorageApi storageApi;

    @Override
    public Object prepareBuy(String userId, String code, Long count) {
        log.info("开始TCC xid:" + RootContext.getXID());
        //1.查询账户 扣款
        AccountTbl accountTbl = accountTblMapper.selectById(userId);
        AccountTbl accountTbl1 = accountTbl.setMoney(accountTbl.getMoney() - count);
        accountTblMapper.updateById(accountTbl1);
        //2.远程创建订单
        orderClint.insertOrder(accountTbl.getUserId(), code, count);
        //3.远程扣库存
        storageApi.tcc("iphone11", count);
        return "执行完毕!";
    }

    @Override
    public boolean commit(BusinessActionContext actionContext) {
        log.info("xid = " + actionContext.getXid() + "提交成功");
        return true;
    }

    @Override
    public boolean rollback(BusinessActionContext actionContext) {
        // 获取下单时的提交参数
        String userId = actionContext.getActionContext("userId").toString();
        Long count = Long.parseLong(actionContext.getActionContext("count").toString());
        // 进行分支事务扣掉的金额回滚
        AccountTbl accountTbl = accountTblMapper.selectById(userId);
        AccountTbl accountTbl1 = accountTbl.setMoney(accountTbl.getMoney() + count);
        accountTblMapper.updateById(accountTbl1);
        log.info("xid = " + actionContext.getXid() + "进行回滚操作");
        return true;
    }
}

使用@GlobalTransactional开启全局事务:


    @GetMapping("/testTcc")
    @GlobalTransactional
    public Object test() {
        return  accountTblService.prepareBuy("11111111","iphone11",1L);
    }


订单和库存服务也仿照上面书写。

2.3 测试

发生异常时,可以看到,TCC模式进行了回滚操作。
在这里插入图片描述

2.4 总结

上面简单实现了TCC 模式,但是存在很多问题,使用起来也巨麻烦,所以就不再深究了

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

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

相关文章

PDF格式转换为翻页电子书,这种形式太酷辣!

PDF作为工作生活中最常见的文档格式之一&#xff0c;但是PDF格式阅读体验感不是那么好&#xff0c;这时候如果将PDF转化为翻页电子书再阅读&#xff0c;体验感不就直接拉满了嘛&#xff01;如何将PDF格式转换为翻页电子书呢&#xff1f; 为了解决这个问题&#xff0c;我们推荐…

国产数据库TiDB单机部署最佳实践

创建用户 ##创建用户 adduser tidb#设置密码 passwd tidb 配置免密码登录 cat >> /etc/sudoers << "EOF" tidb ALL(ALL) NOPASSWD:ALL EOF 创建tidb用户ssh key 切换用户 [rootjeames ~]# su - tidb 执行命令&#xff0c;一直按回车键就行 [tidbjeames…

官方认证:研发效能(DevOps)工程师职业技术认证

培养端到端的研发效能人才 为贯彻落实《关于深化人才发展体制机制改革的意见》&#xff0c;推动实施人才强国战略&#xff0c;促进专业技术人员提升职业素养、补充新知识新技能&#xff0c;实现人力资源深度开发&#xff0c;推动经济社会全面发展&#xff0c;根据《中华人民共…

build.gradle配置国内镜像源

maven { url https://maven.aliyun.com/repository/google/ } maven { url https://maven.aliyun.com/repository/jcenter/} maven { url https://jitpack.io }

【Eclipse】安装与卸载教程

目录 1.绿色版免安装版本 2.安装版本 3.卸载 首先打开官网&#xff1a;Eclipse Downloads | The Eclipse Foundation 选择download package 如图所示&#xff0c;到如下界面 1.绿色版免安装版本 按图片点击&#xff0c;即可开始下载 下载好后解压 &#xff0c;在桌面创建…

中青急速版更新(青龙脚本)

原脚本失效&#xff0c;请用新脚本&#xff0c;每天50毛左右见 实际运行情况见下图 中青入口&#xff1a;中青急速版软件入口 变量 export zqurlxxxxxxx 抓这个https://user.youth.cn/v1/user/userinfo.json?xxxxxx 脚本&#xff08;文件另存为zqjsf.py&#xff09; impor…

JAVA发送消息到RabbitMq

项目中&#xff0c;作为生产者自定义消息发送到RabbitMq。 1.引入rmq依赖 <!-- rabbitmq 依赖 --><dependency><groupId>com.rabbitmq</groupId><artifactId>amqp-client</artifactId><version>5.9.0</version></dependen…

Leetcode刷题解析——最大连续1的个数

1. 题目链接&#xff1a;1004. 最大连续1的个数 III 2. 题目描述&#xff1a; 给定一个二进制数组 nums 和一个整数 k&#xff0c;如果可以翻转最多 k 个 0 &#xff0c;则返回 数组中连续 1 的最大个数 。 示例 1&#xff1a; 输入&#xff1a;nums [1,1,1,0,0,0,1,1,1,1,0]…

【MySql系列】深入解析数据库索引

写在前面 MySQL索引是数据库中一个关键的概念&#xff0c;它可以极大地提高查询性能&#xff0c;加快数据检索速度。但是&#xff0c;要充分发挥索引的作用&#xff0c;需要深入理解它们的工作原理和使用方式。 在本文中&#xff0c;我们将深入解析MySQL索引&#xff0c;探讨它…

PyCharm安装和使用教程

简介 PyCharm是一种PythonIDE&#xff08;Integrated Development Environment&#xff0c;集成开发环境&#xff09;&#xff0c;带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具&#xff0c;比如调试、语法高亮、项目管理、代码跳转、智能提示、自动完成、单…

护眼灯色温多少最好?儿童护眼灯色温范围多少

如果不想家里的孩子年纪小小的就戴着眼镜&#xff0c;从小就容易近视&#xff0c;那么护眼灯的选择就非常重要了&#xff0c;但是市场上那么多品类&#xff0c;价格也参差不齐&#xff0c;到底怎么选呢&#xff1f;色温该是多少呢&#xff1f;为大家推荐五款色温完全没问题的护…

【特纳斯电子】JDY-10M模块

视频及资料链接&#xff1a;JDY-10M模块 - 电子校园网 (mcude.com) 一、实物图 二、原理图 引脚定义 内部引脚图 三、简介 JDY-10 透传模块是基于蓝牙 4.0 协议标准&#xff0c;工作频段为 2.4GHZ 范围&#xff0c;调制方式为 GFSK(高斯频移键控&#xff0c;在调制之前通过一…

人形机器人:未来与现实的交汇

原创 | 文 BFT机器人 人形机器人是一种模仿人类外形和动作的机器人&#xff0c;具有复杂的机械结构和智能控制系统。随着科技的不断进步和应用领域的扩大&#xff0c;人形机器人行业正逐渐崭露头角&#xff0c;成为一个具有巨大潜力的新兴产业。根据高盛的预测&#xff0c;到2…

存档&改造【07】多表查询和可操控对象的存储

前情摘要 在可操作对象一栏中&#xff0c;默认IS_ALL所有人可见&#xff0c;还可以指定用户和部门&#xff0c;可操作对象存在CODE_SYSTEM_OPERATION&#xff08;晶码-接入系统操作项&#xff09;表中&#xff0c;部门/用户ID&NAME存在CODE_SYSTEM_OPERATION_AUTH&#xf…

Prompt 驱动架构设计:探索复杂 AIGC 应用的设计之道?

你是否曾经想过&#xff0c;当你在 Intellij IDEA 中输入一个段代码时&#xff0c;GitHub 是如何给你返回相关的结果的&#xff1f;其实&#xff0c;这背后的秘密就是围绕 Prompt 生成而构建的架构设计。 Prompt 是一个输入的文本段落或短语&#xff0c;用于引导 AI 生成模型执…

《数字图像处理-OpenCV/Python》连载(22)绘制直线与线段

《数字图像处理-OpenCV/Python》连载&#xff08;22&#xff09;绘制直线与线段 本书京东优惠购书链接&#xff1a;https://item.jd.com/14098452.html 本书CSDN独家连载专栏&#xff1a;https://blog.csdn.net/youcans/category_12418787.html 第 4 章 绘图与鼠标交互 本章介…

Http/https代理和抓包分析

前言 最近工作需要部署http/https的代理&#xff0c;所以用squid部署了一下&#xff0c;重新回顾了一下http和https的代理知识。 HTTP代理 根据《HTTP 权威指南》如图&#xff1a; 这种情况下&#xff0c;对访问服务器而言&#xff0c;它会把代理当做客户端&#xff0c;完全…

C++算法:前缀和基础

相关 源码测试用例下载 https://download.csdn.net/download/he_zhidan/88430716 包括4个压缩包&#xff0c;初始代码&#xff0c;实现前缀和&#xff0c;实现前缀积&#xff0c;实现前缀异或。都是在前者的基础上修改的。 本博文是CSDN学院课程的讲义 https://edu.csdn.net/c…

【linux kernel】linux的platform设备驱动框架分析

文章目录 一、简介二、platform总线三、platform设备和驱动的匹配过程四、platrom驱动和platform设备五、platform驱动设计六、代码示例 &#x1f53a;【linux内核系列文章】 &#x1f449;对一些文章内容进行了勘误&#xff0c;本系列文章长期不定时更新&#xff0c;希望能分享…

可视化上证50结构图

可视化上证50结构图 缘由收集数据先获取50支成分股列表获取各成分股票K线数据 数据处理找出来&#xff0c;再删除&#xff0c;然后重新下载数据最终获得每日报价的变化值 图形结构处理聚类分析使用affinity_propagation(亲和传播)聚类 嵌入二维平面空间可视化小结热力图 缘由 …