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

╰半橙微兮° 2024-04-23 21:08 140阅读 0赞

?作者主页:青花锁 ?简介: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

  1. /**
  2. * 采购
  3. */
  4. @PostMapping("/purchaseTCC")
  5. @GlobalTransactional
  6. public String purchaseTCC(@RequestBody OrderDTO orderDTO){
  7. this.businessTCCService.purchase(orderDTO);
  8. return "success";
  9. }

2.2、定义service

  1. @LocalTCC
  2. public interface BusinessTCCService {
  3. /**
  4. * 采购 执行资源检查及预留操作
  5. */
  6. @TwoPhaseBusinessAction(name = "purchase",commitMethod = "commit",rollbackMethod = "rollback")
  7. public void purchase(@BusinessActionContextParameter(paramName = "orderDTO") OrderDTO orderDTO);
  8. /**
  9. * 全局事务进行提交
  10. * @param businessActionContext
  11. * @return
  12. */
  13. boolean commit(BusinessActionContext businessActionContext);
  14. /**
  15. * 全局事务进行不回滚
  16. * @param businessActionContext
  17. * @return
  18. */
  19. boolean rollback(BusinessActionContext businessActionContext);
  20. }
  21. package com.xxxx.store.business.service.impl;
  22. import cn.hutool.crypto.SecureUtil;
  23. import com.alibaba.fastjson.JSON;
  24. import com.alibaba.fastjson.JSONObject;
  25. import com.xxxx.store.business.service.BusinessService;
  26. import com.xxxx.store.business.service.BusinessTCCService;
  27. import com.xxxx.store.business.service.OrderService;
  28. import com.xxxx.store.business.service.StorageService;
  29. import com.xxxx.store.common.dto.OrderDTO;
  30. import com.xxxx.store.common.dto.StorageDTO;
  31. import io.seata.rm.tcc.api.BusinessActionContext;
  32. import io.seata.spring.annotation.GlobalTransactional;
  33. import org.springframework.beans.factory.annotation.Autowired;
  34. import org.springframework.beans.factory.annotation.Value;
  35. import org.springframework.stereotype.Service;
  36. import java.io.File;
  37. @Service
  38. public class BusinessTCCServiceImpl implements BusinessTCCService {
  39. @Value("${file.path}")
  40. private String filePath;
  41. @Autowired
  42. private OrderService orderService;
  43. @Autowired
  44. private StorageService storageService;
  45. @Override
  46. public void purchase(OrderDTO orderDTO) {
  47. //减库存
  48. this.storageService.deduct(new StorageDTO(null,orderDTO.getCommodityCode(),orderDTO.getCount()));
  49. //创建订单
  50. this.orderService.create(orderDTO);
  51. }
  52. @Override
  53. public boolean commit(BusinessActionContext businessActionContext) {
  54. System.out.println("事务ID:" + businessActionContext.getXid());
  55. return true;
  56. }
  57. @Override
  58. public boolean rollback(BusinessActionContext businessActionContext) {
  59. JSONObject jSONObject = (JSONObject)businessActionContext.getActionContext("orderDTO");
  60. OrderDTO orderDTO = jSONObject.toJavaObject(OrderDTO.class);
  61. StorageDTO storageDTO = new StorageDTO(null, orderDTO.getCommodityCode(), orderDTO.getCount());
  62. String s = JSON.toJSONString(storageDTO);
  63. String md5 = SecureUtil.md5(s);
  64. System.out.println("**************触发回滚操作:" + filePath + md5);
  65. File file = new File(filePath + md5);
  66. file.delete();
  67. return true;
  68. }
  69. /*@Override
  70. public void purchase(OrderDTO orderDTO) {
  71. //减库存
  72. this.storageService.deduct(new StorageDTO(null,orderDTO.getCommodityCode(),orderDTO.getCount()));
  73. //创建订单
  74. this.orderService.create(orderDTO);
  75. }*/
  76. }

























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

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

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


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

在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,140人围观)

还没有评论,来说两句吧...

相关阅读