Java微服务分布式事务框架seata的TCC模式

news2024/11/28 0:46:29

🌹作者主页:青花锁 🌹简介:Java领域优质创作者🏆、Java微服务架构公号作者😄

🌹简历模板、学习资料、面试题库、技术互助

🌹文末获取联系方式 📝

在这里插入图片描述


往期热门专栏回顾

专栏描述
Java项目实战介绍Java组件安装、使用;手写框架等
Aws服务器实战Aws Linux服务器上操作nginx、git、JDK、Vue
Java微服务实战Java 微服务实战,Spring Cloud Netflix套件、Spring Cloud Alibaba套件、Seata、gateway、shadingjdbc等实战操作
Java基础篇Java基础闲聊,已出HashMap、String、StringBuffer等源码分析,JVM分析,持续更新中
Springboot篇从创建Springboot项目,到加载数据库、静态资源、输出RestFul接口、跨越问题解决到统一返回、全局异常处理、Swagger文档
Spring MVC篇从创建Spring MVC项目,到加载数据库、静态资源、输出RestFul接口、跨越问题解决到统一返回
华为云服务器实战华为云Linux服务器上操作nginx、git、JDK、Vue等,以及使用宝塔运维操作添加Html网页、部署Springboot项目/Vue项目等
Java爬虫通过Java+Selenium+GoogleWebDriver 模拟真人网页操作爬取花瓣网图片、bing搜索图片等
Vue实战讲解Vue3的安装、环境配置,基本语法、循环语句、生命周期、路由设置、组件、axios交互、Element-ui的使用等
Spring讲解Spring(Bean)概念、IOC、AOP、集成jdbcTemplate/redis/事务等

系列文章目录

第一章 Java线程池技术应用
第二章 CountDownLatch和Semaphone的应用
第三章 Spring Cloud 简介
第四章 Spring Cloud Netflix 之 Eureka
第五章 Spring Cloud Netflix 之 Ribbon
第六章 Spring Cloud 之 OpenFeign
第七章 Spring Cloud 之 GateWay
第八章 Spring Cloud Netflix 之 Hystrix
第九章 代码管理gitlab 使用
第十章 SpringCloud Alibaba 之 Nacos discovery
第十一章 SpringCloud Alibaba 之 Nacos Config
第十二章 Spring Cloud Alibaba 之 Sentinel
第十三章 JWT
第十四章 RabbitMQ应用
第十五章 RabbitMQ 延迟队列
第十六章 spring-cloud-stream
第十七章 Windows系统安装Redis、配置环境变量
第十八章 查看、修改Redis配置,介绍Redis类型
第十九章 Redis RDB AOF
第二十章 Spring boot 操作 Redis
第二十一章 Java多线程安全与锁
第二十二章 Java微服务分布式事务框架seata
第二十三章 Java微服务分布式事务框架seata的TCC模式


文章目录

  • 往期热门专栏回顾
  • 系列文章目录
  • 前言
  • 1、TCC模式
    • 1.1、AT 模式(参考链接 TBD)基于 支持本地 ACID 事务 的 关系型数据库
      • 1.1.1、 一阶段 prepare 行为
      • 1.1.2、二阶段 commit 行为
      • 1.1.3、二阶段 rollback 行为
    • 1.2、TCC 模式,不依赖于底层数据资源的事务支持
      • 1.2.1、一阶段 prepare 行为
      • 1.2.2、二阶段 commit 行为
      • 1.2.3、二阶段 rollback 行为
  • 2、例子
    • 2.1、定义controller
    • 2.2、定义service


前言

上一章节介绍微服务分布式项目中,使用的事务框架seata,本章节介绍分布式事务框架seata TCC模式,以及集成到Springboot、微服务框架里。

1、TCC模式

一个分布式的全局事务,整体是 两阶段提交 的模型。全局事务是由若干分支事务组成的,分支事务要满足 两阶段提交 的模型要求,即需要每个分支事务都具备自己的:

  • 一阶段 prepare 行为
  • 二阶段 commit 或 rollback 行为
    在这里插入图片描述

根据两阶段行为模式的不同,我们将分支事务划分为 Automatic (Branch) Transaction Mode 和 TCC (Branch) Transaction Mode.

1.1、AT 模式(参考链接 TBD)基于 支持本地 ACID 事务 的 关系型数据库

1.1.1、 一阶段 prepare 行为

在本地事务中,一并提交业务数据更新和相应回滚日志记录。

1.1.2、二阶段 commit 行为

马上成功结束,自动 异步批量清理回滚日志。

1.1.3、二阶段 rollback 行为

通过回滚日志,自动 生成补偿操作,完成数据回滚。

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

1.2.1、一阶段 prepare 行为

调用 自定义 的 prepare 逻辑。try

1.2.2、二阶段 commit 行为

调用 自定义 的 commit 逻辑。confirm

1.2.3、二阶段 rollback 行为

调用 自定义 的 rollback 逻辑。cancel

2、例子

2.1、定义controller

/**
 * 采购
 */
@PostMapping("/purchaseTCC")
@GlobalTransactional
public String purchaseTCC(@RequestBody OrderDTO orderDTO){
    this.businessTCCService.purchase(orderDTO);
    return "success";
}

2.2、定义service

@LocalTCC
public interface BusinessTCCService {
    /**
     * 采购 执行资源检查及预留操作
     */
    @TwoPhaseBusinessAction(name = "purchase",commitMethod = "commit",rollbackMethod = "rollback")
    public void purchase(@BusinessActionContextParameter(paramName = "orderDTO") OrderDTO orderDTO);

    /**
     * 全局事务进行提交
     * @param businessActionContext
     * @return
     */
    boolean commit(BusinessActionContext businessActionContext);

    /**
     * 全局事务进行不回滚
     * @param businessActionContext
     * @return
     */
    boolean rollback(BusinessActionContext businessActionContext);
}

package com.xxxx.store.business.service.impl;

import cn.hutool.crypto.SecureUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.xxxx.store.business.service.BusinessService;
import com.xxxx.store.business.service.BusinessTCCService;
import com.xxxx.store.business.service.OrderService;
import com.xxxx.store.business.service.StorageService;
import com.xxxx.store.common.dto.OrderDTO;
import com.xxxx.store.common.dto.StorageDTO;
import io.seata.rm.tcc.api.BusinessActionContext;
import io.seata.spring.annotation.GlobalTransactional;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.io.File;

@Service
public class BusinessTCCServiceImpl implements BusinessTCCService {
    @Value("${file.path}")
    private String filePath;
    @Autowired
    private OrderService orderService;
    @Autowired
    private StorageService storageService;

    @Override
    public void purchase(OrderDTO orderDTO) {
        //减库存
        this.storageService.deduct(new StorageDTO(null,orderDTO.getCommodityCode(),orderDTO.getCount()));
        //创建订单
        this.orderService.create(orderDTO);
    }

    @Override
    public boolean commit(BusinessActionContext businessActionContext) {
        System.out.println("事务ID:" + businessActionContext.getXid());
        return true;
    }

    @Override
    public boolean rollback(BusinessActionContext businessActionContext) {
        JSONObject jSONObject = (JSONObject)businessActionContext.getActionContext("orderDTO");

        OrderDTO orderDTO = jSONObject.toJavaObject(OrderDTO.class);
        StorageDTO storageDTO = new StorageDTO(null, orderDTO.getCommodityCode(), orderDTO.getCount());

        String s = JSON.toJSONString(storageDTO);
        String md5 = SecureUtil.md5(s);
        System.out.println("**************触发回滚操作:" + filePath + md5);
        File file = new File(filePath + md5);
        file.delete();
        return true;
    }

    /*@Override
    public void purchase(OrderDTO orderDTO) {
        //减库存
        this.storageService.deduct(new StorageDTO(null,orderDTO.getCommodityCode(),orderDTO.getCount()));
        //创建订单
        this.orderService.create(orderDTO);
    }*/

}
注解描述
@LocalTCC一定需要注解在接口上,否则不生效,此接口可以是寻常的业务接口,只要实现了TCC的两阶段提交对应方法便可,适用于SpringCloud+Feign模式下的TCC。
@TwoPhaseBusinessAction注解try方法,其中name为当前tcc方法的bean名称,写方法名便可(全局唯一),commitMethod指向提交方法,rollbackMethod指向事务回滚方法。指定好三个方法之后,seata会根据全局事务的成功或失败,自动调用提交方法或者回滚方法。
@BusinessActionContextParameter使用该注解可以将参数传递到二阶段commit或者rollback的方法中,方便调用。
BusinessActionContextTCC事务上下文,使用BusinessActionContext.getActionContext(“params”)便可以得到一阶段try中定义的参数,在二阶段参考此参数进行业务回滚操作。

建议:可以在try方法中使用@Transational,直接通过spring来控制关系型数据库的事务,进行回滚的操作,而非关系型数据库等中间件的回滚操作可以交给rollbackMethod方法处理。

建议:try接口不可以捕获异常,否则TCC将识别该操作为成功,直接执行二阶段commit方法。


资料获取,更多粉丝福利,关注下方公众号获取

在这里插入图片描述

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

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

相关文章

教大家使用vue实现 基础购物车。

首先我要知道一点 其能够数据变化的 都用{{}}来进行渲染类似 来看一下实现效果 实现思路 : 1,引进 vue.js 2,setup 将声明变量 方法放在setup里面 3,用响应式声明 ref() 或rective声明 可以声明对象等等 let 也…

AST学习入门

AST学习入门 1.AST在线解析网站 https://astexplorer.net/ 1.type: 表示当前节点的类型,我们常用的类型判断方法t.is********(node)**,就是判断当前的节点是否为某个类型。 2**.start**:表示当前节点的开始位置 3.end:当前节点结束 4.loc : 表示当前节点所在的行…

产品推荐 | 基于Xilinx FPGA XC5VFX100T的6U VPX视频叠加板卡

01、产品概述 本板卡是基于Xilinx FPGA XC5VFX100T的6U VPX视频叠加板卡。主要用于视频叠加板具有多种高清图形输入接口,可实现其中两路高清视频信号的开窗显示和叠加显示功能;或者输出和输入图形接口的转换。 02、物理特性 ● 尺寸:6U CPC…

【文献阅读】AlphaFold touted as next big thing for drug discovery — but is it?

今天来精读2023年10月发在《Nature》上的一篇新闻:AlphaFold touted as next big thing for drug discovery — but is it? (nature.com)https://www.nature.com/articles/d41586-023-02984-w Questions remain about whether the AI tool for predicting protein …

Python Windows系统 虚拟环境使用

目录 1、安装 2、激活 3、停止 1、安装 1)为项目新建一个目录(比如:目录命名为learning_log) 2)在终端中切换到这个目录 3)执行命令:python -m venv ll_env,即可创建一个名为ll…

常用的6个的ChatGPT网站,国内可用!

GPTGod 🌐 链接: GPTGod 🏷️ 标签: GPT-4 免费体验 支持API 支持绘图 付费选项 📝 简介:GPTGod 是一个功能全面的平台,提供GPT-4的强大功能,包括API接入和绘图支持。用户可以选择免…

成都百洲文化传媒有限公司电商新浪潮的领航者

在当今电商行业风起云涌的时代,成都百洲文化传媒有限公司以其独特的视角和专业的服务,成为了众多商家争相合作的伙伴。今天,就让我们一起走进百洲文化的世界,探索其背后的成功密码。 一、百洲文化的崛起之路 成都百洲文化传媒有限…

短视频矩阵系统---php7.40版本升级自研

短视频矩阵系统---php7.40版本升级自研 1.部署及搭建 相对于其他系统,该系统得开发及部署难度主要在各平台官方应用权限的申请上,据小编了解,目前抖音短视频平台部分权限内侧名额已满,巧妇难为无米之炊,在做相关程序…

unity 添加newtonsoft-json

再git url上添加:com.unity.nuget.newtonsoft-json

手机如何设置静态IP地址显示

随着移动互联网的普及,手机已经成为我们日常生活中不可或缺的一部分。在连接无线网络时,我们有时需要设置手机的IP地址为静态,以满足特定的网络需求或解决某些网络问题。本文将指导您如何在手机上设置静态IP地址显示,让您更好地管…

二、typescript基础语法

一、条件语句 二、函数 1、有名函数 function add(x:number, y:number):number {return x y;}2、匿名函数 let add function (x:number, y:number):number {return x y;}函数可选参数 function buildName(firstname: string, lastname?:string) {if (lastname) {return fi…

蓝牙耳机哪个品牌最好?2024年热门机型推荐合集分享

​随着蓝牙耳机的普及,越来越多的年轻人开始追求这种无线的便利。市场上品牌众多,款式多样,选择起来确实让人眼花缭乱。我整理了一份蓝牙耳机品牌排行榜前十名,希望能为你提供一些参考,帮助你找到心仪的耳机。 一、202…

HarmonyOS实战开发-编写一个分布式邮件系统

概述 本篇Codelab是基于TS扩展的声明式开发范式编程语言编写的一个分布式邮件系统,可以由一台设备拉起另一台设备,每次改动邮件内容,都会同步更新两台设备的信息。效果图如下: 说明: 本示例涉及使用系统接口&#xff…

基于springboot的牙科就诊管理系统

技术:springbootmysqlvue 一、系统背景 当前社会各行业领域竞争压力非常大,随着当前时代的信息化,科学化发展,让社会各行业领域都争相使用新的信息技术,对行业内的各种相关数据进行科学化,规范化管理。这样…

mysql分页查询多用GitCode平台

目录 一、在GitCode平台AI搜索结果(这个更优) 二、在百度搜索输入“mysql Java分页查询”的输出结果: 三、推荐的文章 四、GitCode的使用 1)如搜索jdk11可以直接下载jdk11的包 2)搜索开源项目 3)如搜…

学浪怎么下载视频_学浪下载视频方法

越来越多人购买了学浪课程,但是苦于学浪视频官方不提供下载选项,于是就有人做了学浪视频下载软件,这里就教大家如何下载你已经购买的学浪课程 本次教程用到的软件都在下面的链接 链接:https://pan.baidu.com/s/1y7vcqILToULrYAp…

网络: 数据链路层

数据链路层: 数据帧的封装与传输 以太网数据帧 源地址和目的地址是指网卡的硬件地址(也叫MAC地址), 长度是48位,是在网卡出厂时固化的;帧协议类型字段有三种值,分别对应IP、ARP、RARP;帧末尾是CRC校验码 以太网 "以太网" 不是一种具体的网络, 而是一种技术标准; 既…

【机器学习】一文搞懂算法模型之:Transformer

Transformer 1、引言2、Transformer2.1 定义2.2 原理2.3 算法公式2.3.1 自注意力机制2.3.1 多头自注意力机制2.3.1 位置编码 2.4 代码示例 3、总结 1、引言 小屌丝:鱼哥, 你说transformer是个啥? 小鱼:嗯… 啊… 嗯…就是… 小屌…

Rust基本类型

数值类型 整数类型 无符号整数只能取正数和0,有符号整数可以取正数负数和0。isize和usize类型取决于程序运行的计算机CPU类型,若CPU是32位的,则这两个类型是32位的,若CPU是64位的,则它们是64位的。rust整型 默认使用…

CentOS/RHEL 6.5 上 NFS mount 挂起kernel bug

我本身有四台机器做WAS集群,挂载nfs,其中随机一台客户端计算机端口关闭释放将进入不良状态,对 NFSv4 挂载的任何访问都将挂起(例如“ls,cd 或者df均挂起”)。这意味着没有人并且所有需要访问共享的用户进程…