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

🌹作者主页:青花锁 🌹简介: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;@Autowiredprivate OrderService orderService;@Autowiredprivate StorageService storageService;@Overridepublic void purchase(OrderDTO orderDTO) {//减库存this.storageService.deduct(new StorageDTO(null,orderDTO.getCommodityCode(),orderDTO.getCount()));//创建订单this.orderService.create(orderDTO);}@Overridepublic boolean commit(BusinessActionContext businessActionContext) {System.out.println("事务ID:" + businessActionContext.getXid());return true;}@Overridepublic 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;}/*@Overridepublic 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.mzph.cn/news/762931.shtml

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

相关文章

3/21作业

#include <myhead.h> int do_add(sqlite3 *ppDb) { int add_numb 0; char add_name[20] {0}; double add_score 0; printf("请输入学号:"); scanf("%d",&add_numb); printf("请输入姓名:"); scanf(&q…

Python机器学习019:sklearn中如何找到测试集中预测错误的样本在原数据中所在的索引位置

原理 要查看预测错误的 X_test 在原始数据集中的索引,你可以首先找到预测错误的样本索引,然后将这些索引映射回原始数据集的索引。 案例 from sklearn.model_selection import train_test_split from sklearn.linear_model import LogisticRegression from sklearn.metric…

鸿蒙ArkTS实战开发-Native XComponent组件的使用

介绍 本篇Codelab主要介绍如何使用XComponent组件调用NAPI来创建EGL/GLES环境&#xff0c;实现在主页面绘制一个正方形&#xff0c;并可以改变正方形的颜色。本篇CodeLab使用Native C模板创建。 如图所示&#xff0c;点击绘制矩形按钮&#xff0c;XComponent组件绘制区域中渲…

Sketch软件:重塑UI/UX设计流程的革命性工具

Sketch是一款在Mac操作系统上运行的矢量图形设计软件&#xff0c;其功能特色丰富多样&#xff0c;深受设计师们的喜爱。以下是Sketch软件的主要功能特色介绍&#xff1a; 专业矢量图形设计&#xff1a;Sketch为UI设计、移动应用设计和Web设计等领域提供了强大的支持。它支持线条…

了解OGC

什么是OGC OGC&#xff08;Open Geospatial Consortium&#xff09;是一个国际性的组织&#xff0c;专注于制定和发布开放的地理信息标准&#xff0c;以促进地理空间数据和服务的互操作性和共享。其目标是在全球范围内推动地理信息系统&#xff08;GIS&#xff09;和地理空间技…

串口控制LED灯

uart.c #include "uart4.h"void uart4_init() {//使能GPIOB GPIOG UART4外设时钟RCC->MP_AHB4ENSETR | (0x1<<1);//GPIOBRCC->MP_AHB4ENSETR | (0x1<<6);//GPIOGRCC->MP_APB1ENSETR | (0X1<<16);//UART4//设置PB2和PG11管脚复用//PB2GPI…

即时编译器在JVM调优战场的决胜策略

目录 一、方法内联 二、循环展开 三、分支预测 四、逃逸分析 4.1 栈上分配 4.2 标量替换 4.3 同步消除 五、冗余消除 JVM中的即时编译器&#xff08;如HotSpot的C1、C2编译器&#xff09;会对代码进行即时编译优化&#xff0c;即时编译优化&#xff08;Just-In-Time Compi…

【JavaScript 中的数据类型】

JavaScript 中的基本数据类型 基本数据类型 数字&#xff08;Number&#xff09;&#xff1a;用于表示数字&#xff0c;包括整数和浮点数。字符串&#xff08;String&#xff09;&#xff1a;用于表示文本数据。布尔值&#xff08;Boolean&#xff09;&#xff1a;用于表示逻…

数据结构奇妙旅程之线性表

线性表&#xff08;Linear List&#xff09;是数据结构中的一种基本类型&#xff0c;它代表了具有相同类型数据元素的一个有限序列。线性表中的数据元素之间是一对一的关系&#xff0c;即除了第一个元素外&#xff0c;每个元素有且仅有一个前驱元素&#xff1b;除了最后一个元素…

Hive常用函数 之 数值处理

Hive常用函数 之 数值处理 以下是Hive中常用的数值处理函数&#xff0c;可用于执行各种数学运算和数值转换操作。 1. ABS()&#xff1a;返回一个数的绝对值。 SELECT ABS(-10); -- 输出: 102. ROUND()&#xff1a;对一个数进行四舍五入。 SELECT ROUND(10.56); -- 输出: 113.…

探索ChatGPT时代下的下一代信息检索系统:机遇与挑战

1 Introduction 2022 年 11 月 30 日&#xff0c;OpenAI 推出了 ChatGPT&#xff0c;这是一款由先进的 GPT3.5 和更高版本的 GPT-4 生成语言模型提供支持的 AI 聊天机器人应用程序。该应用迅速吸引了全球超亿用户&#xff0c;创下了产品快速传播的新纪录。 它能够以对话的方式…

ElasticSearch 用法

首先讲下 ES的倒排序索引 创建倒排索引是对正向索引的一种特殊处理&#xff0c; 将每一个文档的数据利用算法分词&#xff0c;得到一个个词条 创建表&#xff0c;每行数据包括词条、词条所在文档id、位置等信息 因为词条唯一性&#xff0c;可以给词条创建索引&#xff0c;例如…

旅游小程序开发的费用及功能

随着科技的发展和智能手机的普及&#xff0c;越来越多的行业开始利用小程序来进行线上服务。旅游业作为一个重要的服务业&#xff0c;也纷纷推出了自己的旅游小程序&#xff0c;以方便游客在线预订、查询景点信息等。那么&#xff0c;旅游小程序开发的费用是多少&#xff1f;功…

Google研究者们提出了VLOGGER模型

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

【探索Linux】—— 强大的命令行工具 P.29(网络编程套接字 —— 简单的TCP网络程序模拟实现)

阅读导航 引言一、TCP协议二、TCP网络程序模拟实现1. 预备代码⭕ThreadPool.hpp&#xff08;线程池&#xff09;⭕makefile文件⭕打印日志文件⭕将当前进程转变为守护进程 2. TCP 服务器端实现&#xff08;TcpServer.hpp&#xff09;3. TCP 客户端实现&#xff08;main函数&…

babyos 学习记录

宏定义头文件 将一个宏定义取不同的数据到不同的数组中&#xff1b; 侵入式链表 struct list_head { struct list_head *next, *prev; }; // 添加&#xff08;list_add_tail/list_add&#xff09;、删除、查找 xx.h // 定义一个用于链表管理的结构体 typedef sturct{ xxx …

探索数据库的世界:分类、作用与特点

数据库是现代信息时代的基础设施之一&#xff0c;它是一种组织、存储、管理和检索数据的系统。数据库在各个领域都有着广泛的应用&#xff0c;如企业、政府、医疗、金融等&#xff0c;它可以帮助企业和组织高效地管理和分析数据&#xff0c;从而做出更好的决策。本文将介绍数据…

matlab矩形薄板小挠度弯曲有限元编程 |【Matlab源码+理论文本】|板单元| Kirchoff薄板 | 板壳单元

专栏导读 作者简介&#xff1a;工学博士&#xff0c;高级工程师&#xff0c;专注于工业软件算法研究本文已收录于专栏&#xff1a;《有限元编程从入门到精通》本专栏旨在提供 1.以案例的形式讲解各类有限元问题的程序实现&#xff0c;并提供所有案例完整源码&#xff1b;2.单元…

分库分表场景下多维查询解决方案(用户+商户)

在采用分库分表设计时&#xff0c;通过一个PartitionKey根据散列策略将数据分散到不同的库表中&#xff0c;从而有效降低海量数据下C端访问数据库的压力。这种方式可以缓解单一数据库的压力&#xff0c;提升了吞吐量&#xff0c;但同时也带来了新的问题。对于B端商户而言&#…

项目技术问题记录-【前端】处理低版本JQuery系UI框架的toggle事件失效的问题

原创作者&#xff1a;田超凡&#xff08;程序员田宝宝&#xff09; 版权所有&#xff0c;引用请注明原作者&#xff0c;严禁复制转载 $.fn.toggle function( fn, fn2 ) { var args arguments,guid fn.guid || $.guid,i0, toggle function( event ) { …