分布式事务解决方案学习--TCC

什么是TCC事务

TCC是 Try,Confirm ,Cancel,三个单词的缩写,TCC要求每个分支事务需要实现三个操作:
预处理Try,确定Confirm ,撤销Cancel。Try操作做业务的检查和资源预留,Confirm做业务确定操作, Cancel实习一个和Try相反的操作及回滚操作,TM(全局事务管理器)首先发起所有分支事务的try操作,任何一个分支事务的try操作失败,TM将会发起除失败分支的所有分支事务的Cancel,若try都成功,TM将会发起所有分支事务的Confirm 操作,Confirm 或者Cancel执行失败TM会进行重试。
1. Try阶段做业务检查(一致性)及资源的预留,此阶段仅为一个初步操作,和后续的Confirm 才是一个完整业务逻辑
2. Confirm阶段做确定提交,Try阶段的所有分支事务都执行成功后开始执行Confirm ,通常情况下,采用TCC则认为Confirm 阶段不会出错,try都成功了则Confirm 必须得成功,若出现错误,需要引入重试机制或者人工处理。
3. Cancel 业务取消阶段,Try阶段的分支事务有一个出现失败后开始执行Cancel,通常情况下,采用TCC则认为Cancel阶段不会出错,try都成功了则Cancel必须得成功,若出现错误,需要引入重试机制或者人工处理。

  • 成功情况
    在这里插入图片描述

  • 失败情况
    在这里插入图片描述

空回滚

在没有调用TCC资源Try方法的情况下,调用了二阶段的Cancel方法, Cancel方法需要识别出这是一个空回滚,然后直接返回成功。出现原因是当一个分支事务所在服务宕机或网络异常,分支事务调用记录为失败,这个时候其实是没有执行Try阶段,当故障恢复后,分布式 事务进行回滚则会调用二阶段的Cancel方法,从而形成空回滚。
解决思路:关键就是要识别出这个空回滚。在try执行时写入一条执行记录,在回滚的时候先去判断try是否已经执行过了

幂等性

通过前面介绍已经了解到,为了保证TCC二阶段提交重试机制不会引发数据不一致,要求TCC的二阶段Try、Confirm 和Cancel接口保证幂等,这样不会重复使用或者释放资源。如果幂等控制没有做好,很有可能导致数据不一致等严重问题。
解决思路:运行时增加执行状态记录,每次执行前都查询该状态。

悬挂

悬挂就是对于一个分布式事务,其二阶段Cancel接口比Try接口先执行。出现原因是在RPC调用分支事务try时,先注册分支事务,再执行RPC调用,如果此时RPC调用的网络发生拥堵,通常RPC调用是有超时时间的, RPC超时以后, TM就会通知RM回滚该分布式事务,可能回滚完成后, RPC请求才到达参与者真正执行,而一个Try方法预留的业务资源,只有该分布式事务才能使用,该分布式事务第一阶段预留的业务资源就再也没有人能够处理了,对于这种情况 ,我们就称为悬挂,即业务资源预留后没法继续处理。
解决思路: 解决思路是如果二阶段执行完成,那一阶段就不能再继续执行。在执行一阶段事务时判断在该全局事务下,"分支事务记录”表中是否已经有二阶段事务记录,如果有则不执行Try。

解决方案 Hmily分布式事务框架

官网 https://dromara.org/zh/projects/hmily/overview/
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
框架帮我们做了悬挂处理,但是重试机制的存在还是需要用户自行处理幂等性问题

快速体验

在这里插入图片描述
在这里插入图片描述
根据说明修改配置文件
在这里插入图片描述
启动好项目打开swagger看看作者写的测试接口文档
在这里插入图片描述
这里直接来试试第一个mockAccountWithTryException接口
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

confirmMethod方法中执行修改订单成功操作,cancelMethod方法中执行修改订单失败操作
在这里插入图片描述
去账户服务扣减金额
在这里插入图片描述
发现账号服务直接抛异常
在这里插入图片描述
那么来说订单服务执行回滚会把订单修改为3 失败的状态
在这里插入图片描述
调用接口
在这里插入图片描述
发现这时数据库中的订单的确是3说明分布式事务控制成功

这里只做简单演示,项目中的示例还是比较全的

学习资料:黑马分布式事务解决方案 https://www.bilibili.com/video/BV1FJ411A7mV?p=17&share_source=copy_web
Hmily官网: https://dromara.org/zh/projects/hmily/overview/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
1、课程简介Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。       在本套课程中,我们将全面的讲解Spring Cloud技术栈, 从环境的部署到技术的应用,再到项目实战,让我们不仅是学习框架技术的使用,而且可以学习到使用Spring Cloud如何解决实际的问题。Spring Cloud各个组件相互配合,合作支持了一套完整的微服务架构。- 注册中心负责服务的注册与发现,很好将各服务连接起来- 断路器负责监控服务之间的调用情况,连续多次失败进行熔断保护。- API网关负责转发所有对外的请求和服务- 配置中心提供了统一的配置信息管理服务,可以实时的通知各个服务获取最新的配置信息- 链路追踪技术可以将所有的请求数据记录下来,方便我们进行后续分析- 各个组件又提供了功能完善的dashboard监控平台,可以方便的监控各组件的运行状况2、适应人群有一定的Java基础,并且要有一定的web开发基础。3、课程亮点       系统的学习Spring Cloud技术栈,由浅入深的讲解微服务技术。涵盖了基础知识,原理剖析,组件使用,源码分析,优劣分析,替换方案等,以案例的形式讲解微服务中的种种问题和解决方案l  微服务的基础知识n  软件架构的发展史n  微服务的核心知识(CAP,RPC等)l  注册中心n  Eureka搭建配置服务注册n  Eureka服务端高可用集群n  Eureka的原理和源码导读n  Eureka替换方案Consuln  Consul下载安装&服务注册&高可用l  服务发现与服务调用n  Ribbon负载均衡基本使用&源码分析n  Feign的使用与源码分析n  Hystrix熔断(雪崩效应,Hystrix使用与原理分析)n  Hystrix替换方案Sentinell  微服务网关n  Zuul网关使用&原理分析&源码分析n  Zuul 1.x 版本的不足与替换方案n  SpringCloud Gateway深入剖析l  链路追踪n  链路追踪的基础知识n  Sleuth的介绍与使用n  Sleuth与Zipkin的整合开发l  配置中心n  SpringClond Config与bus 开发配置中心n  开源配置中心Apollo4、主讲内容章节一:1.     微服务基础知识2.     SpringCloud概述3.     服务注册中心Eureka4.     Eureka的替换方案Consul章节二:1.     Ribbon实现客户端负载均衡2.     基于Feign的微服务调用3.     微服务熔断技术Hystrix4.     Hystrix的替换方案Sentinel章节三:1.     微服务网关Zuul的基本使用2.     Zuul1.x 版本的不足和替换方案3.     深入SpringCloud Gateway4.     链路追踪Sleuth与Zipkin章节四:1.     SpringCloud Config的使用2.     SpringCloud Config结合SpringCloud Bus完成动态配置更新3.     开源配置中心Apollo

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值