TCC分布式事务_样例讲解

分布式事务(三)Seata TCC 模式 - Spring Cloud 微服务 添加 TCC 分布式事务 分布式事务(三)Seata TCC 模式 TCC 基本原理 TCC 与 Seata AT 事务一样都是两阶段事务,它与 AT 事务的主要区别为: TCC 对业务代码侵入严重 每个阶段的数据操作都要自己进行编码来实现,事务框架无法自动处理。 TCC 效率更高 不必对数据加全局锁,允许多个事务同时操作数据。 第一阶段 Try 以账户服务为例,当下订单时要扣减用户账户金额 假如用户购买 100 元商品,要扣减 100 元。 TCC 事务首先对这100元的扣减金额进行预留,或者说是先冻结这100元 阅读详情

分布式事务协议的背景

 之前几篇讲的是关于分布式的相关事项,今天我们用一个电商系统的样例来讲述分布式事务的工作。

1. 业务场景介绍

 假设现在有一个电商系统,里面有一个支付订单的场景。如下图:

支付逻辑
 那对一个订单支付之后,我们需要做下面的步骤:

  • 更改订单的状态为“已支付”
  • 扣减商品库存
  • 给会员增加积分
  • 创建销售出库单通知仓库发货

2.实现TCC分布式事务的效果

 TCC分布式事务要求的就是[1] 订单服务-修改订单状态,[2] 库存服务-扣减库存,[3] 积分服务-增加积分,[4] 仓储服务-创建销售出库单这四个步骤,要么全部成功,要么全部失败。原子性,不允许有些成功,有些失败,必须是一个整体性的事务。

 举个例子,现在订单的状态都修改为“已支付”了,结果库存服务扣减库存失败。那个商品的库存原来是 100 件,现在卖掉了 2 件,本来应该是 98 件了。

 结果呢?由于库存服务操作数据库异常,导致库存数量还是 100。这不是在坑人么,当然不能允许这种情况发生了!

 但是如果你不用 TCC 分布式事务方案的话,就用个 Spring Cloud 开发这么一个微服务系统,很有可能会干出这种事儿来。

 失败的样例情况如下图:
分布式事务失败情况

 要满足分布式事务,其逻辑应该为:
分布式事务正确逻辑

3.TCC分布式事务落地实现

  • TCC 实现阶段一:Try

 首先,订单服务那儿,它的代码大致来说应该是这样子的:

public class OrderService {

    // 库存服务
    @Autowired
    private InventoryService inventoryService;

    // 积分服务
    @Autowired
    private CreditService creditService;

    // 仓储服务
    @Autowired
    private WmsService wmsService;

    // 对这个订单完成支付
    public void pay(){
        //对本地的的订单数据库修改订单状态为"已支付"
        orderDAO.updateStatus(OrderStatus.PAYED);

        //调用库存服务扣减库存
        inventoryService.reduceStock();

        //调用积分服务增加积分
        creditService.addCredit();

        //调用仓储服务通知发货
        wmsService.saleDelivery();
    }
}

 上面的操作就是订单服务完成本地数据库操作之后,通过 Spring Cloud 的 Feign 来调用其他的各个服务罢了。但是这也不能实现TCC分布式事务的操作,我们来做下修改。

 首先,上面那个订单服务先把自己的状态修改为:OrderStatus.UPDATING。 这个状态是个没有任何含义的这么一个状态,代表有人正在修改这个状态罢了。

 这是啥意思呢?也就是说,在 pay() 那个方法里,你别直接把订单状态修改为已支付啊!你先把订单状态修改为 UPDATING,也就是修改中的意思。然后呢,库存服务直接提供的那个 reduceStock() 接口里,也别直接扣减库存啊,你可以是冻结掉库存。

 举个例子,本来你的库存数量是 100,你别直接 100 - 2 = 98,扣减这个库存!你可以把可销售的库存:100 - 2 = 98,设置为 98 没问题,然后在一个单独的冻结库存的字段里,设置一个 2。也就是说,有 2 个库存是给冻结了。

 积分服务的 addCredit() 接口也是同理,别直接给用户增加会员积分。你可以先在积分表里的一个预增加积分字段加入积分。比如:用户积分原本是 1190,现在要增加 10 个积分,别直接 1190 + 10 = 1200 个积分啊! 你可以保持积分为 1190 不变,在一个预增加字段里,比如说 prepare_add_credit 字段,设置一个 10,表示有 10 个积分准备增加。

 仓储服务的 saleDelivery() 接口也是同理啊,你可以先创建一个销售出库单,但是这个销售出库单的状态是“UNKNOWN”。也就是说,刚刚创建这个销售出库单,此时还不确定它的状态是什么呢!

 上面这套改造接口的过程,其实就是所谓的 TCC 分布式事务中的第一个 T 字母代表的阶段,也就是 Try 阶段。

总结上述过程,如果你要实现一个 TCC 分布式事务,首先你的业务的主流程以及各个接口提供的业务含义,不是说直接完成那个业务操作,而是完成一个 Try 的操作。

这个操作,一般都是锁定某个资源,设置一个预备类的状态,冻结部分数据,等等,大概都是这类操作。

用一张图来表示就是:
Try阶段实现原理
 

  • TCC 实现阶段二:Confirm

 然后就分成两种情况了,第一种情况是比较理想的,那就是各个服务执行自己的那个 Try 操作,都执行成功了!

 这个时候,就需要依靠 TCC 分布式事务框架来推动后续的执行了。这里简单提一句,如果你要玩儿 TCC 分布式事务,必须引入一款 TCC 分布式事务框架,比如国内开源的 ByteTCC、Himly、TCC-transaction。

否则的话,感知各个阶段的执行情况以及推进执行下一个阶段的这些事情,不太可能自己手写实现,太复杂了。

如果你在各个服务里引入了一个 TCC 分布式事务的框架,订单服务里内嵌的那个 TCC 分布式事务框架可以感知到,各个服务的 Try 操作都成功了。

此时,TCC 分布式事务框架会控制进入 TCC 下一个阶段,第一个 C 阶段,也就是 Confirm 阶段。

为了实现这个阶段,你需要在各个服务里再加入一些代码。比如说,订单服务里,你可以加入一个 Confirm 的逻辑,就是正式把订单的状态设置为“已支付”了,大概是类似下面这样子:

public class OrderServiceConfirm {

    public void pay(){
        orderDao.updateStatus(OrderStatus.PAYED);
    }
}

 库存服务也是类似的,你可以有一个 InventoryServiceConfirm 类,里面提供一个 reduceStock() 接口的 Confirm 逻辑,这里就是将之前冻结库存字段的 2 个库存扣掉变为 0。 这样的话,可销售库存之前就已经变为 98 了,现在冻结的 2 个库存也没了,那就正式完成了库存的扣减。

 积分服务也是类似的,可以在积分服务里提供一个 CreditServiceConfirm 类,里面有一个 addCredit() 接口的 Confirm 逻辑,就是将预增加字段的 10 个积分扣掉,然后加入实际的会员积分字段中,从 1190 变为 1120。

 仓储服务也是类似,可以在仓储服务中提供一个 WmsServiceConfirm 类,提供一个 saleDelivery() 接口的 Confirm 逻辑,将销售出库单的状态正式修改为“已创建”,可以供仓储管理人员查看和使用,而不是停留在之前的中间状态“UNKNOWN”了。

 好了,上面各种服务的 Confirm 的逻辑都实现好了,一旦订单服务里面的 TCC 分布式事务框架感知到各个服务的 Try 阶段都成功了以后,就会执行各个服务的 Confirm 逻辑。订单服务内的 TCC 事务框架会负责跟其他各个服务内的 TCC 事务框架进行通信,依次调用各个服务的 Confirm 逻辑。然后,正式完成各个服务的所有业务逻辑的执行。

同样,给大家来一张图,顺着图一起来看看整个过程:
confirm阶段逻辑

  • TCC 实现阶段三:Cancel

 举个例子:在 Try 阶段,比如积分服务吧,它执行出错了,此时会怎么样?

 那订单服务内的 TCC 事务框架是可以感知到的,然后它会决定对整个 TCC 分布式事务进行回滚。也就是说,会执行各个服务的第二个 C 阶段,Cancel 阶段。同样,为了实现这个 Cancel 阶段,各个服务还得加一些代码。

 首先订单服务,它得提供一个 OrderServiceCancel 的类,在里面有一个 pay() 接口的 Cancel 逻辑,就是可以将订单的状态设置为“CANCELED”,也就是这个订单的状态是已取消。库存服务也是同理,可以提供 reduceStock() 的 Cancel 逻辑,就是将冻结库存扣减掉 2,加回到可销售库存里去,98 + 2 = 100。积分服务也需要提供 addCredit() 接口的 Cancel 逻辑,将预增加积分字段的 10 个积分扣减掉。仓储服务也需要提供一个 saleDelivery() 接口的 Cancel 逻辑,将销售出库单的状态修改为“CANCELED”设置为已取消。

 然后这个时候,订单服务的 TCC 分布式事务框架只要感知到了任何一个服务的 Try 逻辑失败了,就会跟各个服务内的 TCC 分布式事务框架进行通信,然后调用各个服务的 Cancel 逻辑。

大家看看下面的图,直观的感受一下:
cancel操作
4.总结与思考
 TCC分布式事务:首先需要选择某种 TCC 分布式事务框架,各个服务里就会有这个 TCC 分布式事务框架在运行。

然后你原本的一个接口,要改造为 3 个逻辑,Try-Confirm-Cancel:

1) 先是服务调用链路依次执行 Try 逻辑。

2) 如果都正常的话,TCC 分布式事务框架推进执行 Confirm 逻辑,完成整个事务。

3) 如果某个服务的 Try 逻辑有问题,TCC 分布式事务框架感知到之后就会推进执行各个服务的 Cancel 逻辑,
撤销之前执行的各种操作。

最后,再给大家来一张图,来看看给我们的业务,加上分布式事务之后的整个执行流程:
分布式事务流程

dubbo教程-10-分布式事务框架tcc-transaction dubbo的作者 对于dubbo实现分布式事务的一些观点 他自己本人 不主张在 dubbo 这个框架本身 去实现分布式事务 而是 dubbo 和 任何 业务框架一样 都可以被事务管理器 事务切面 甚至是 事务框架集成 因为 事务 不是 dubbo 该考虑的事情 同时 dubbo 开发者 们也在官网建议 尽可能的 把 一个 服务的范围扩大 通过 模块 功能设计 来 回避 分布式事务的问题 但是我自... 阅读详情

相关推荐

分布式事务——分布式事务简介、分布式事务框架 Seata(AT模式、Tcc模式、Tcc Vs AT)、分布式事务—MQ

最早的分布式事务应用架构很简单,不涉及服务间的访问调用,仅仅是服务内操作涉及到对多个数据库资源的访问。当一个服务操作访问不同的数据库资源,又希望对它们的访问具有事务特性时,就需要采用分布式事务来协调所有的事务参与者。对于上面介绍的分布式事务应用架构,尽管一个服务操作会访问多个数据库资源,但是毕竟整个事务还是控制在单一服务的内部。如果一个服务操作需要调用另外一个服务,这时的事务就需要跨越多个服务了。四种模式,https1.4.01.2.0Seata是什么?一阶段,这些就不再赘述了。总之,...

m0_67402013的博客 769

分布式事务 TCC

TCC(Try-Confirm-Cancel)是一种分布式事务解决方案,也是一种补偿式的分布式事务。它通过在业务逻辑中嵌入Try-Confirm-Cancel三个阶段的逻辑,来保证分布式事务的一致性和可靠性。TCC协议的核心思想是“补偿机制”,即在分布式事务出现异常或失败时,通过执行相反的操作来补偿之前的操作,从而达到事务的一致性。

激流丶的博客 2896

分布式事务处理实践:使用TCC和Saga方案进行分布式事务管理

作者:禅与计算机程序设计艺术 1.简介 分布式事务(Distributed Transaction)是一个很重要的问题。众所周知,事务是一个不可分割的工作单元,为了保证数据一致性,分布式系统通常采用ACID特性来完成事务的四个属性:原子性、一致性、隔离性、持久性。但在实际应用中,事务往往会遇到复杂的场景

AI天才研究院 2283

分布式事务协议

TM首先发起所有的分支事务的try操作,任何一个分支事务的try操作执行失败,TM将会发起所有分支事务的Cancel操作,若try操作全部成功,TM将会发起所有分支事务的Confirm操作,其中Confirm/Cancel操作若执行失败,TM会进行重试。当没有调用参与方Try方法的情况下,就调用了二阶段的Cancel方法(比如调try时超时了,会接着调Cancel),Cancel方法需要有办法识别出此时Try有没有执行,如果Try还没执行,表示这个Cancel操作是无效的,即本次Cancel属于空回滚;

他叫阿来 1215

保姆级教程:手把手教你用记事本修改DNF私服PVF,打造毕业级自定义装备

本文提供了一份详细的DNF私服PVF文件修改教程,教你如何使用记事本轻松打造毕业级自定义装备。从PVF文件结构解析到基础属性修改,再到高级特效设置,手把手教你实现装备属性的全方位定制,无需编程基础即可完成。

weixin_42525385的博客 1197

S32K144之芯片锁死解锁——关闭debug端口

S32K144之芯片锁死及解锁 经常捣鼓单片机就会发现,时常会因为某些操作不当导致芯片锁死情况的发生,通过Jlink我们可以读到芯片的ID,但是无法进行Debug,这很是让人苦恼。 基于S32K144的芯片锁死,一般有如下几种可能: 1、时钟配置异常,过高的配置时钟频率以及不配置时钟,都有可能造成芯片保护锁死,我就曾经因为不注意把时钟配置代码注释掉,导致芯片锁死。 2、我是微软雅黑烧写断电,如果在...

weixin_41935674的博客 1万+

分布式事务TCC浅析

分布式事务TCC

阳光大男孩!!!的博客 609

大数据国赛第2套任务C-子任务一特征工程

根据**Hudi**的dwd_ds_hudi库中相关表或MySQL中shtd_store中相关表(order_detail、sku_info),计算出与用户id为6708的用户所购买相同商品种类最多的前10位用户(只考虑他俩购买过多少种相同的商品,不考虑相同的商品买了多少次),将10位用户id进行输出,若与多个用户购买的商品种类相同,则输出结果按照用户id升序排序,输出格式如下,将结果截图粘贴至客户端桌面【Release任务C提交结果.docx】中对应的任务序号下;

weixin_44117248的博客 904

分布式理论之事务一致性和其常见协议 2PC、3PC、分布式消息、TCC、SAGA、AT

1.分布式事物主要是解决分布式环境下,组合事物的一致性问题。 2.事务也分本地事务和分布式事务,这里主要介绍分布式事务,本地事务可以参考我的另一篇文章 [数据库原理之数据库事物](https://blog.youkuaiyun.com/weixin_40979518/article/details/131313594) 3.常见的分布式事务协议 2PC、3PC、基于分布式消息的最终一致性方案、SAGA、TCC、XA

不会骑摩托的程序员不是好的摄影师 1853

宝塔面板添加站点及运营商SSL免费证书的申请与使用

本文详细介绍在宝塔面板下如何正确添加站点、配置站点,及在运营商如何申请免费SSL证书,将其配置到宝塔站点里。 给你的网站加一把锁,教你免费SSL证书申请,配置到自己的网站中。 环境:Ubuntu server 18 工具:宝塔控制面板 平台:阿里云 Web服务器:Nginx 宝塔:https://www.bt.cn/ 阿里云:https://www.aliyun.com/ 腾讯云:https://cloud.tencent.com/ 要求: 1.宝塔控制面板搭建完毕。 2掌握域名解析的原理。 3.了解ht

贺兰山长老 5058

RS485/CAN总线防护电路设计:TVS选型与ESD防护实战解析

本文深入解析了RS485与CAN总线防护电路设计中的TVS选型与ESD防护实战技巧。针对工业现场常见的静电放电、浪涌等干扰,文章详细阐述了TVS管关键参数的选择、多级防护体系的构建,并特别强调了在隔离电路设计中地回路处理的重要性,帮助工程师设计出更可靠的通信接口。

metaverse5vr的博客 386

分布式事务原子性-TCC

在分布式系统中,分布式事务是指跨越多个独立的计算机或服务节点的一系列操作。这些操作必须以原子性进行,要么全部执行成功,要么全部回滚,保持数据的一致性和完整性。原子性是分布式事务的关键特性之一,它确保了事务的不可分割性和一致性。具体来说,原子性要求一个事务中的所有操作要么都成功地被提交,要么都被完全撤销。让我看一下。

Road_的专栏 702

当SLAM遇上FPGA:打造一个会“硬件加速”的激光雷达SLAM系统

点云数据的运动畸变校正特征点提取与匹配、以及ICP迭代最近点配准。在传统方案中,我们通常用ARM核完成所有计算。但点云配准中的最近邻搜索(KD-Tree)需要大量分支判断,CPU处理起来效率很低;而ICP中的矩阵分解(SVD)虽然计算量大,但非常适合并行化。ZYNQ的特殊之处在于它把ARM(PS端)和FPGA(PL端)集成在同一颗芯片上。ARM擅长跑操作系统、处理复杂逻辑和调度,FPGA擅长做高吞吐量的并行计算。两者之间通过AXI总线高速互联,数据交换延迟只有几十个时钟周期。

QQ_778132974的博客 375

2019最新微服务架构的分布式事务解决方案(Dubbo分布式事务处理)

课程介绍:分布式事务是一个绕不过去的挑战!微服务架构本质上就是分布式服务化架构,微服务架构的流行,让分布式事务问题日益突出!尤其是在订单业务、资金业务等系统核心业务流程中,一定要有可靠的分布式事务解决方案来保证业务数据的可靠性和准确性。为了解决大家在实施分布式服务化架构过程中关于分布式事务问题的困扰,本教程将基于支付系统真实业务中的经典场景来对“可靠消息的最终一致性方案”、“TCC两阶段型方案...

Z5430的博客 577

基于深度学习的火焰检测系统:YOLOv8 + UI界面 + 数据集详解

YOLO(You Only Look Once)是一种端到端的目标检测算法,其最大优势在于将目标检测任务转化为一个回归问题,可以在一次前向传播中同时完成目标定位和分类。YOLOv8是YOLO系列中的最新版本,相比之前的版本,YOLOv8在精度和推理速度上都做了显著提升,特别是在小物体检测方面表现更加优秀。实时性:YOLOv8具有较高的推理速度,适用于实时火焰检测。高精度:相较于YOLOv7,YOLOv8在精度和小物体检测上有所改进。简单易用:YOLOv8的API简单直观,易于集成和使用。

YOLO 660

国家基本比例尺分幅土地利用现状图制作

本次主要解决的问题是如何构建脚本快速生成所涉及区域标准国家基本比例尺分幅,然后制作土地利用现状图模板,套用模板生成标准分幅土地利用现状图。

xyt1172228177的博客 2458

分布式事务讲解 - 2PC、3PC、TCC

一个操作由多个不同服务器的子操作组成,分布式事务就是要保证这些子操作要不全部执行成功,要不全部执行失败。从本质上讲,分布式事务就是为了保证不同数据库的数据一致性。在2PC的第一阶段基础之上,3PC新加了一个准备阶段(上图所示),用于询问所有参与者节点是否已经准备好要进行分布式事务操作了,这一阶段没有对资源的占用,只是测试数据库是否能获取锁即可,只是保证所有参与者都有能力参与事务,如果有网络或者其他问题就不用进行第二、三阶段了。

IT枫斗者的博客 1828

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

分布式事务解决方案之TCC

一、什么是TCC事务 TCC是Try、Confirm、Cancel三个词语的缩写, TCC要求每个分支事务实现三个操作:预处理Try、确认Confirm、撤销Cancel。 Try操作做业务检查及资源预留,Confirm做业务确认操作,Cancel实现一个与Try相反的操作即回滚操作。 TM首先发起所有的分支事务的try操作,任何一个分支事务的try操作执行失败,TM将会发起所有分支事务的Cancel操作, 若try操作全部成功,TM将会发起所有分支事务的Confirm操作,其中Confirm/

Jak的博客 1857

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

分布式事务讲解 - Seata分布式事务框架(AT、TCC两种模式)

分布式事务讲解 - Seata分布式事务框架(AT、TCC两种模式)

m0_63164811的博客 2020

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

实战!阿里神器 Seata 实现 TCC模式 解决分布式事务,真香

TCC(Try Confirm Cancel)方案是一种应用层面侵入业务的两阶段提交。针对每个操作,都要注册一个与其对应的确认和补偿(撤销)操作。第一阶段:Try(尝试),主要是对业务系统做检测及资源预留(加锁,锁住资源)第二阶段:本阶段根据第一阶段的结果,决定是执行confirm还是cancelConfirm(确认):执行真正的业务(执行业务,释放锁)Cancle(取消):是预留资源的取消(出问题,释放锁)

2401_83384536的博客 3172

分布式事务讲解之CAP,2PC,3PC,TCC,分布式锁

是两阶段提交的一个变种,针对每个操作,都需要有一个其对应的确认和取消操作,当操作成功时调用确认操作,当操作失败时调用取消操作,类似于二阶段提交,只不过是这里的提交和回滚是针对业务上的,所以基于TCC实现的分布式事务也可以看做是对业务的一种补偿机制,其核心思想是:针对每个操作,都要注册一个与其对应的确认和补偿(撤销)操作。try阶段:尝试去执行,完成所有业务的一致性检查,预留必须的业务资源。Confirm阶段:确认执行业务,如果Try阶段执行成功,接着执行Confirm 阶段。

上善若泪 5667

这可能是你读过最透彻的TCC方案讲解|分布式事务系列(三)

本文从两个场景说起,详细描述了TCC的详细过程,以及对比2PC有什么区别,适用什么样的场景。点击上方“后端开发技术”,选择“设为星标” ,优质资源及时送达在面试前复习 TCC 的时候你是不是这样做的:百度TCC关键词,随便找了篇文章,查询到他有try、confirm、Cancel 三个阶段,业务侵入度高,和两阶段差不多。复习完毕。如果你是这样去理解和复习的,只能说对 TCC 的理解太不到位了,真的...

Daniel的博客 3239

分布式事务讲解 - TX-LCN分布式事务框架(含LCN、TCC、TXC三种模式)

分布式事务讲解 - TX-LNC分布式事务框架(含LCN、TCC、TXC三种模式)

m0_63164811的博客 4082

springcloud进阶:四种分布式事务模式之TCC模式(二)

0.引言 上一章我们讲解了AT模式原理及适用场景,本期我们来讲讲TCC模式 1. TCC模式 TCC模式,全称Try-Confirm-Cancel,通过名称也能看出来其流程主要有三个步骤: 预处理 Try:实现业务检查和资源预留 确认/提交 Confirm:业务确认和提交 撤销/回滚 Cancel:业务回滚 如果看过上一章的同学,看到这里是不是有点熟悉了,这不也是二阶段提交嘛。TCC模式本身就是二阶段提交的一种改进,不一样的是,这次就没有AT模式那么方便了,因为他需要我们自己写代码来实现了。 1.2

55555的博客 3896
上一篇: TCC分布式事务简介
下一篇: MySQL认知__explain简介(上)
pseudonym_
博客等级 码龄10年 88粉丝 205原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值