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

LangChain Agent Skills 实战指南:12个案例玩转智能体技能封装与编排

大语言模型应用开发中,智能体(Agent)的能力扩展正从零散的函数调用走向标准化封装。Agent Skills 将某项具体能力组织为带说明、代码与依赖的技能目录,让模型能自动发现和调度,其核心价值在于解决工具数量膨胀后的维护混乱与调用失控问题。与 Tool 的单一执行、MCP 的协议连接不同,Skill 更强调能力的语义描述与组合复用,配合 LangGraph 的状态编排和 LangSmith 的可观测性,可构建生产级智能体系统。在实际场景中,Agent Skills 可覆盖 RAG 知识库问答、多轮记忆保

weixin_34335458的博客 407

【IIC通信】Chap.1(I2C)IIC通信原理、IIC读写时序详解

IIC通信以两根连线SDA、SCL实现了完善的全双工同步数据传送, 可以方便地构成多机系统和外围器件扩展系统。

Jie_MSD的博客 2万+

分布式事务TCC浅析

分布式事务TCC

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

基于Active-HDL的HDL设计录入与仿真

作者:毛茏玮 / Saint 掘金:https://juejin.im/user/5aa1f89b6fb9a028bb18966a 微博:https://weibo.com/5458277467/profile?topnav=1&wvr=6&is_all=1 GitHub:github.com/saint-000 优快云: https://me.youkuaiyun.com/qq_4053...

一个会写代码的烤鸭 7782

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

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

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

【Microchip】微芯 MPLAB® X IDE开发环境新建项目(点亮1颗LED灯)(常用右键菜单快捷键)

1.新建项目2. 选择芯片型号和调试器3.选择编译器4.项目命名和选择文件路径5.新建成功,给项目添加main.c7.将新建的mainXC16.c文件添加进项目6000000UL这三个就是。

Naiva的博客 451

动力学约束下的运动规划算法——状态栅格规划器(State Lattice Planner)

A*、RRT等算法建立的用于路径搜索的图模型是不考虑机器人的动力学约束的,其构建的图模型的两个相邻节点之间的路径可能是不可行的,或者很难被机器人跟踪的,现在我们想要使得图中相邻两个节点间的连接是一种满足动力学约束的可行的连接,那么如何构建一个这样的图呢? 构建这样的图通常有两种方法:第一种是基于控制空间的采样(正向方法)

慕羽★的博客 3105

分布式事务原子性-TCC

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

Road_的专栏 702

3. 动手运行第一个 SAP Fiori Elements 应用(ListReport 类型)

这个代理服务器能够自动监听我们 Fiori Elements 应用里向 ES5 Demo 系统发送的 OData 请求,拦截这个请求,并通过 Node.js 代码向 ES5 服务器转发,拿到响应数据后再交还给 Fiori Elements 应用。后者对自己发出的请求被代理这件事情一无所知。本文的任务是,大家按照我的介绍,在本地成功运行笔者准备的这个 Fiori Elements 应用。的错误消息, 说明大家安装的 Node.js 版本没有达到本地运行 Fiori Elements 的最低要求。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1671

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

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

Z5430的博客 577

基于MATLAB编程的LSTM的时间序列预测

时间序列预测,回归分析,LSTM详细原理

abc991835105的博客 360

实验2 存储器设计与实现【计算机组成原理】

实验2 存储器设计与实现【计算机组成原理】

小心星的博客 2398

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

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

IT枫斗者的博客 1828

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

分布式事务解决方案之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

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

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

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

m0_63164811的博客 2020

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

实战!阿里神器 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、付费专栏及课程。

余额充值