推广网站推广,wordpress百家号模版,wordpress熊掌认证,wordpress正文底部版权信息#x1f339;作者主页#xff1a;青花锁 #x1f339;简介#xff1a;Java领域优质创作者#x1f3c6;、Java微服务架构公号作者#x1f604; #x1f339;简历模板、学习资料、面试题库、技术互助 #x1f339;文末获取联系方式 #x1f4dd; 往期热门专栏回顾
专栏… 作者主页青花锁 简介Java领域优质创作者、Java微服务架构公号作者 简历模板、学习资料、面试题库、技术互助 文末获取联系方式 往期热门专栏回顾
专栏描述Java项目实战介绍Java组件安装、使用手写框架等Aws服务器实战Aws Linux服务器上操作nginx、git、JDK、VueJava微服务实战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爬虫通过JavaSeleniumGoogleWebDriver 模拟真人网页操作爬取花瓣网图片、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、定义controller2.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的两阶段提交对应方法便可适用于SpringCloudFeign模式下的TCC。TwoPhaseBusinessAction注解try方法其中name为当前tcc方法的bean名称写方法名便可全局唯一commitMethod指向提交方法rollbackMethod指向事务回滚方法。指定好三个方法之后seata会根据全局事务的成功或失败自动调用提交方法或者回滚方法。BusinessActionContextParameter使用该注解可以将参数传递到二阶段commit或者rollback的方法中方便调用。BusinessActionContextTCC事务上下文使用BusinessActionContext.getActionContext(“params”)便可以得到一阶段try中定义的参数在二阶段参考此参数进行业务回滚操作。
建议:可以在try方法中使用Transational直接通过spring来控制关系型数据库的事务进行回滚的操作而非关系型数据库等中间件的回滚操作可以交给rollbackMethod方法处理。
建议:try接口不可以捕获异常否则TCC将识别该操作为成功直接执行二阶段commit方法。 资料获取更多粉丝福利关注下方公众号获取