Spring Boot 中的 TCC 事务

news2025/4/7 11:21:29

Spring Boot 中的 TCC 事务

在分布式系统中,事务一直是一个棘手的问题。传统的 ACID 事务无法满足分布式系统的需求,因为它们需要强一致性、单点故障和网络延迟等问题。近年来,随着微服务架构的普及,TCC 事务成为了一种非常流行的分布式事务解决方案。在 Spring Boot 中,我们可以很容易地使用 TCC 事务来管理分布式事务。本文将介绍 TCC 事务的概念和原理,并说明如何在 Spring Boot 中使用它们。

在这里插入图片描述

TCC 事务的概念和原理

TCC 事务是一种基于补偿事务的分布式事务解决方案。它由 Try、Confirm 和 Cancel 三个阶段组成,每个阶段都是一个本地事务。

在 TCC 事务中,Try 阶段会尝试执行业务操作,并为 Confirm 和 Cancel 阶段做好准备。如果 Try 阶段执行成功,则 Confirm 阶段会提交事务,否则 Cancel 阶段会回滚事务。

举个例子,假设我们要在两个账户之间转账。在 TCC 事务中,我们可以这样实现:

  1. Try 阶段:从账户 A 中扣减金额,同时向账户 B 中增加金额。
  2. Confirm 阶段:提交 Try 阶段的操作,将金额转移成功。
  3. Cancel 阶段:回滚 Try 阶段的操作,将金额转移失败。

在 TCC 事务中,如果 Confirm 阶段执行成功,则整个事务就提交成功了;如果 Confirm 阶段执行失败,则整个事务就会回滚。

Spring Boot 中的 TCC 事务实现

在 Spring Boot 中,我们可以使用 Seata 来实现 TCC 事务。Seata 是一款开源的分布式事务解决方案,可以帮助我们实现分布式事务的管理和控制。

以下是一个简单的 Spring Boot + Seata TCC 事务示例,用于转账操作:

  1. 定义 TCC 服务接口
public interface AccountService {
    @TccTransaction
    void transfer(String fromAccountId, String toAccountId, BigDecimal amount);
    boolean tryTransfer(String fromAccountId, String toAccountId, BigDecimal amount);
    void confirmTransfer(String fromAccountId, String toAccountId, BigDecimal amount);
    void cancelTransfer(String fromAccountId, String toAccountId, BigDecimal amount);
}

在这个示例中,我们定义了一个 AccountService 接口,其中包含了 transfer、tryTransfer、confirmTransfer 和 cancelTransfer 四个方法。其中,transfer 方法是一个 TCC 事务方法,tryTransfer、confirmTransfer 和 cancelTransfer 方法是其对应的 Try、Confirm 和 Cancel 方法。

  1. 实现 TCC 服务接口
@Service
public class AccountServiceImpl implements AccountService {
    @Resource
    private AccountMapper accountMapper;

    @Override
    public boolean tryTransfer(String fromAccountId, String toAccountId, BigDecimal amount) {
        Account fromAccount = accountMapper.selectById(fromAccountId);
        if (fromAccount.getBalance().compareTo(amount) < 0) {
            throw new RuntimeException("Insufficient balance");
        }
        accountMapper.updateBalance(fromAccountId, fromAccount.getBalance().subtract(amount));
        return true;
    }

    @Override
    public void confirmTransfer(String fromAccountId, String toAccountId, BigDecimal amount) {
        Account toAccount = accountMapper.selectById(toAccountId);
        accountMapper.updateBalance(toAccountId, toAccount.getBalance().add(amount));
    }

    @Override
    public void cancelTransfer(String fromAccountId, String toAccountId, BigDecimal amount) {
        Account fromAccount = accountMapper.selectById(fromAccountId);
        accountMapper.updateBalance(fromAccountId, fromAccount.getBalance().add(amount));
    }

    @Override
    public void transfer(String fromAccountId, String toAccountId, BigDecimal amount) {
        boolean result = tryTransfer(fromAccountId, toAccountId, amount);
        if (!result) {
            throw new RuntimeException("Try transfer failed");
        }
    }
}

在这个示例中,我们实现了AccountService 接口,并覆盖了 tryTransfer、confirmTransfer 和 cancelTransfer 三个方法。其中,tryTransfer 方法会尝试扣减账户余额并返回 true,如果余额不足则会抛出异常;confirmTransfer 方法会向目标账户增加金额;cancelTransfer 方法会将扣减的金额恢复到原账户中。transfer 方法是 TCC 事务方法,它会在 tryTransfer 方法执行成功后提交事务,否则回滚事务。

  1. 配置 Seata 数据源

在 Spring Boot 中,我们需要配置 Seata 数据源来支持 TCC 事务。以下是一个基本的 Seata 数据源配置:

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/seata
    username: root
    password: root
    driver-class-name: com.mysql.jdbc.Driver
  cloud:
    alibaba:
      seata:
        tx-service-group: my_test_tx_group
        config:
          type: nacos
          serverAddr: localhost:8848
          namespace: public
          config-mode: file

在这个示例中,我们使用了 Seata 的 Nacos 配置中心来存储配置信息。tx-service-group 属性指定了 Seata 事务组的名称,config-type 属性指定了配置中心的类型,serverAddr 属性指定了配置中心的地址,namespace 属性指定了配置中心的命名空间,config-mode 属性指定了配置中心的模式。

  1. 配置 Seata 代理和 TCC 事务
seata:
  enabled: true
  application-id: account-service
  tx-service-group: my_test_tx_group
  service:
    vgroup-mapping:
      account-service: my_test_tx_group
    group-list: my_test_tx_group
  config:
    type: nacos
    serverAddr: localhost:8848
    namespace: public
    config-mode: file
  registry:
    type: nacos
    serverAddr: localhost:8848
    namespace: public
  tm:
    commit_retry_count: 5
    rollback_retry_count: 5
  undo:
    data-validation: true
    log-table: undo_log

在这个示例中,我们配置了 Seata 的代理和 TCC 事务。enabled 属性指定了是否启用 Seata,application-id 属性指定了当前应用的 ID,tx-service-group 属性指定了 Seata 事务组的名称,service 属性指定了应用和事务组之间的映射关系,config 属性指定了配置中心的类型和地址,registry 属性指定了注册中心的类型和地址,tm 属性指定了事务管理器的参数,undo 属性指定了事务撤销的参数。

  1. 配置 Spring Boot 应用

最后,我们需要在 Spring Boot 应用中配置 Seata 数据源和 TCC 事务。以下是一个基本的 Spring Boot 配置文件:

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/account
    username: root
    password: root
    driver-class-name: com.mysql.jdbc.Driver
  cloud:
    alibaba:
      seata:
        tx-service-group: my_test_tx_group
        config:
          type: nacos
          serverAddr: localhost:8848
          namespace: public
          config-mode: file
        proxy:
          table: undo_log
          log-store: db

在这个示例中,我们配置了 Spring Boot 应用的数据源和 Seata 的 TCC 事务代理。tx-service-group 属性指定了 Seata 事务组的名称,config 属性指定了配置中心的类型和地址,proxy 属性指定了事务代理的参数。

总结

TCC 事务是一种基于补偿事务的分布式事务解决方案,可以帮助我们解决分布式事务的问题。在 Spring Boot 中,我们可以使用 Seata 来实现 TCC 事务,并利用其强大的功能来管理和控制分布式事务。本文介绍了 TCC 事务的概念和原理,并给出了一个基本的 Spring Boot + Seata TCC 事务示例。通过学习本

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

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

相关文章

SpringMVC入门篇4 --- SSM整合案例

目录 SSM整合小案例 源码 1.整合配置(config目录) Spring - SpringConfigMyBatis - MyBatisConfig、JdbcConfig、jdbc.propertiesSpringMVC - ServletConfig、SpringMvcConfig 2.功能模块 模型(domain目录)&#xff1a;Book.java数据层(dao目录)&#xff1a;.BookDao.ja…

windows11安装Linux子系统

个人博客地址: https://cxx001.gitee.io Windows在10之后自带了虚拟机子系统功能&#xff0c;可以和本地磁盘共享&#xff0c;默认挂载到/mnt/目录下面。比起传统的VM方便多了。下面是搭建流程&#xff1a; 一 开启子系统服务 控制面板 -> 程序 -> 程序与功能 -> 启动…

学会vue3,仅需这一篇

V3-组合式API setup/reactive/ref/computed/watch/生命周期/父子通信/模板引用/provide和inject数据传输 vue3的优势** 组合式 API (Composition API) 是一系列 API 的集合&#xff0c;使我们可以使用函数而不是声明选项的方式书写 Vue 组件。 使用create-vue搭建Vue3项目…

Apikit 自学日记:API 变更历史

系统会自动保存API的每一次编辑内容。进入API详情页面&#xff0c;点击 编辑历史 &#xff0c;在弹窗中会列出API的每次改动&#xff0c;您可以点击 详情 了解编辑的概况信息。 如果您想对比当前版本和历史的某个版本的差别&#xff0c;点击 对比 按钮&#xff0c;会在新窗口中…

springboot整合shiro实现认证和授权(非常详细)

Shiro和Spring Sercurity应该是我们比较常用的权限框架了&#xff0c;这篇文章教大家怎么通过springboot整合shiro从0开始搭建一个包含权限控制的后台管理系统。 第一步&#xff1a;创建一个springboot项目 创建springboot项目&#xff0c;这里项目就命名为shiro 第二步&#…

如何用一键抠图工具在线压缩PNG图片

我们会发现&#xff0c;现在用的很多图片格式都是PNG&#xff0c;它通常以无损压缩的方式存储图像。然而&#xff0c;有时候我们可能会遇到PNG文件过大的问题&#xff0c;这样会导致文件传输、存储和加载速度变慢。怎么才能解决这个问题&#xff0c;有什么好用的工具推荐么&…

Linux--多个源文件编译:gcc -o 目标文件 源文件1 源文件2 ...

分析编译过程&#xff1a; 我们编译&#xff0c;实际上是针对.c文件。这里是main.c和test.c。 编译器在预处理的时候会将.h拷贝进.c文件。这里是test.h拷贝到test.c中 .c文件编译后变成.o目标文件。这里main.c和test.c文件编译后变成main.o和test.o 生成的.o文件再和lib.so…

CAD版本转换器有哪些?这些工具轻松转换CAD版本

当我们共享CAD文件时&#xff0c;如果接收人使用的CAD软件版本与发送人不同&#xff0c;则需要将CAD文件转换为接收人能够打开的版本。例如&#xff0c;当您使用的CAD软件版本为AutoCAD 2019&#xff0c;而接收人使用的CAD软件版本为AutoCAD 2017时&#xff0c;您需要将CAD文件…

【PCBA方案设计】电子体温计技术解决方案

体温计&#xff0c;是一种常用于医疗的小型测量产品&#xff0c;体温计通常分为汞体温计和电子体温计&#xff0c;汞体温计的原理非常简单&#xff0c;当汞加热时&#xff0c;它会膨胀&#xff0c;沿着非常狭窄的玻璃管上升。因此&#xff0c;我们将玻璃按一定比例划分&#xf…

windows 如何ping ip 加端口号

先在系统中找到 勾选上 和平时的pingip命令不一样了 现在是telnet ip 端口号 先看一组无法ping通端口号的案例 若telnet 127.0.0.1 6379 跳转至一个空白界面 代表ping此ip的端口号成功

搭建高性能数据库集群之二:MySQL读写分离(基于mycat)

一、MyCat概述 Mycat是数据库中间件。 使用场景&#xff1a; 高可用性与Mysql读写分离 业务数据分级存储大表水平拆分&#xff0c;集群并行计算数据库连接池整合多个数据源整合 安装 下载地址&#xff1a;http://dl.mycat.org.cn 安装Mycat之前&#xff0c;需要安装Mysq…

拜托!电梯机房还不会用这个技巧,就真的晚啦!

电梯是现代社会中不可或缺的交通工具之一&#xff0c;为了确保乘客的安全和顺畅运行&#xff0c;电梯机房的监控是至关重要的环节之一。 电梯机房烟感监控是现代建筑安全管理中非常重要的一环。随着城市高楼大厦的不断增多&#xff0c;电梯作为垂直交通的主要方式&#xff0c;其…

一篇文章告诉你VR全景展示的优势

引言 随着科技的不断进步&#xff0c;VR全景展示作为一项创新的技术应用&#xff0c;正以其独特的优势引领着营销行业的发展潮流。通过虚拟现实技术&#xff0c;VR全景展示为消费者带来了身临其境的观展体验&#xff0c;打破了传统展览的时空限制。 一&#xff0e;沉浸式体验 …

CH32V3xx CAN接口基本使用

1、CH32V3xx CAN简介 CH32V307具有2路CAN控制器,CAN控制器提供了完整的CAN协议实现方案,兼容CAN 规范2.0 A和2.0 B。可编程的传输速率,最高可达1Mbit/s。支持时间触发功能,可避免低优先级消息阻塞。支持3个发送邮箱,发送报文优先级可由报文标识或发送请求次序决定。支持3级…

【kubernetes系列】Kubernetes之生命周期和策略

概述 Pod 遵循一个预定义的生命周期&#xff0c;起始于 Pending 阶段&#xff0c;如果至少 其中有一个主要容器正常启动&#xff0c;则进入 Running&#xff0c;之后取决于 Pod 中是否有容器以 失败状态结束而进入 Succeeded 或者 Failed 阶段。 在 Pod 运行期间&#xff0c;k…

搭建Docker私有仓库

-v 主机到容器的映射&#xff08;卷的挂载&#xff1a;主机和容器的共享&#xff09; 创建容器一定要看成没成功 curl命令 访问浏览器命令 仓库装软件&#xff0c;配置------------- localhost 本机 127.0.0.1 改配置&#xff0c;重启容器 背景介绍 Docker regist…

数据仓库性能测试方法论与工具集

目录 文章目录 目录数据仓库 v.s. 传统数据库数据仓库性能测试案例性能指标测试方案测试场景测试数据集测试用例性能指标测试脚本工具 基准环境准备硬件环境软件环境 测试操作步骤Cloudwave 执行步骤导入数据集TestCase 1. 执行 13 条标准 SQL 测试语句TestCase 2. 执行多表联合…

Java Web JavaScript (3)23.7.3

7&#xff0c;事件监听 要想知道什么是事件监听&#xff0c;首先先聊聊什么是事件&#xff1f; HTML 事件是发生在 HTML 元素上的“事情”。比如&#xff1a;页面上的 按钮被点击、鼠标移动到元素之上、按下键盘按键 等都是事件。 事件监听是JavaScript 可以在事件被侦测到时…

人群密度技术人流量检测

1.贡献 本文的task还是在synthetic的data上训练&#xff0c;在real data上测试&#xff0c;并且之前的方法主要是先将synthetic的data风格转化成real的风格&#xff0c;再训练&#xff0c;来减轻domain的gap带来的问题&#xff0c;但是之前的这样做存在几个问题&#xff0c;第…

基于HTML的图书管理系统(源码+数据库)

一、相关技术介绍 1.HTML 5技术 HTML5作为构造Web内容的语言描述方式和互联网的规范&#xff0c;为网站设计提供了一种全新的思路。将HTML5引入到网站开发领域中&#xff0c;以提高用户体验度&#xff0c;使网站更具有吸引力&#xff0c;增强搜索引擎收录以及增加浏览次数等功…