.Net Core with 微服务 - 分布式事务 - TCC

2023-11-05 22:38

本文主要是介绍.Net Core with 微服务 - 分布式事务 - TCC,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

上一次我们讲解了分布式事务的 2PC、3PC 。那么这次我们来理一下 TCC 事务。本次还是讲解 TCC 的原理跟 .NET 其实没有关系。

TCC

  • Try 准备阶段,尝试执行业务

  • Confirm 完成业务

  • Cancel 回滚准备阶段的业务

TCC 事务其实是 2PC 的一个扩展。上一次我们说了 2PC ,在二阶段进行事务提交。因为 2PC 基本上是利用数据库的 事务能力进行 commit ,其实这里还有可能出现一种 rollback 情况。TCC 就是把 2PC 的二阶段细化了,拆分成了 Confirm 跟 Cancel 两个步骤。TCC 是 2PC 的一次进化,TCC 拆分二阶段后已经不局限于数据库事物了,它可以适用于非数据库事物的场景。因为我们的 Cancel 阶段可以进行更加复杂的回滚能力,业务补偿能力。TCC 可以认为是业务层面的2PC 。


下面我们以使用客户积分兑换房间为示例说明一下 TCC 事务。

  1. Try 为完成 TCC 事务的 Try 阶段,我们需要在房间上增加一个状态字段“是否锁定”,一旦锁定,其它订单就没有办法预定这间房间。同样我们需要在用户积分表上增加一个字段“冻结积分”,如果涉及到并发可能要单独拉一张表出来。这里简化一点就加个字段吧。
    Try阶段开始:订单服务把房间设置为锁定状态;积分服务把用户的积分减去消耗的积分同时把消耗的积分暂存在冻结字段上。

  2. Confirm 如果一阶段都提交成功了,那么所有的服务都开始进入 Confirm 阶段。订单服务把房间状态更改为“已预定”状态;积分服务把冻结的积分清0。这样整个事务都成功完成了。

  3. Cancel 如果一阶段某个服务没有 Try 成功,那么所有的服务都要进入Cancel阶段。比如订单服务锁定房源成功了,积分冻结的时候失败了,那么订单服务要进入 Cancel 阶段,把房间的的锁定状态取消,从新释放出来。如果锁定房源失败了,积分扣减成功了,那么 Cancel 阶段就要把扣减的积分给加回去。

TCC 的一些问题

异常

如果 Confirm 阶段出现异常,TCC 管理器会不断的重试这个阶段,直到成功。因为理论上认为只要 Try 是成功的,那么 Confirm 阶段一定会成功。因为所需要的资源已经在 Try 阶段冻结了。如果 Cancel 阶段出现异常,那么 TCC 管理器也会不断的重试这个阶段来解除冻结的资源。

冥等

因为 TCC 有重试机制,所以所有的接口都需要实现幂等,避免多次调用对业务数据产生错误。比如多次扣款,多次下订单等。

并发问题

因为 TCC 事务在 Try 阶段对资源是完全的提交状态,并没有像 2PC 那样使用数据库事物来对资源进行锁定,所以在并发的时候对资源的修改要格外注意。在处理业务的时候要时刻注意锁定的资源对业务造成的一影响。

允许空取消

TCC 事务在一阶段 Try 的时候失败要运行进行 Cancel 提交。这时候 Cancel 其实是不需要做任何补偿操作,我们称之为空取消。这个时候也要注意,在编写 Cancel 操作的时候要时刻注意到底有没有完成 Try 操作,如果没有完成 Try 操作则要进行空取消。

预付悬挂

TCC 按流程上来说是不会出现悬挂情况的。但是有一种特殊情况会造成资源的悬挂。按照正常流程我们的 Try 阶段总是先于 Cancel 执行的。但是由于网络拥堵的问题造成 Try 调用延迟了,TCC 管理器在一定时间没收到 Try 成功响应后会发送 Cancel 调用,这个 Cancel 就有可能在 Try 之前先被调用了。在 Cancel 执行成功后, 这个 Try 请求调用才到达服务,这个时候如果 Try 被执行成功,那么就会造成资源的悬挂。所以当编写 Try 代码的时候同意需要注意是不是已经调用过 Cancel 操作了。

总结

TCC 事务是 2PC 的一种升级。TCC 相对于 2PC 不再依赖于本地数据库事物能力,它可以使用于应用层面的事务。它把 2PC 的提交跟回滚操作明确的抽象成 Confirm 跟 Cancel 。TCC 事务在逻辑上是比较清晰的。但是 TCC 使用起来也有不方便的地方,就是它对代码入侵比较强,比较繁琐。每个业务都要强制拆分成3个方法。而且还要还要注意幂等,空取消,悬挂等问题。

相关文章

NET Core with 微服务 - 什么是微服务
.Net Core with 微服务 - 架构图
.Net Core with 微服务 - Ocelot 网关
.Net Core with 微服务 - Consul 注册中心
.Net Core with 微服务 - Seq 日志聚合
.Net Core with 微服务 - Elastic APM
.Net Core with 微服务 - Consul 配置中心
.Net Core with 微服务 - Polly 熔断降级
.Net Core with 微服务 - 分布式事务 - 2PC、3PC

关注我的公众号一起玩转技术


这篇关于.Net Core with 微服务 - 分布式事务 - TCC的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/352917

相关文章

poj 1258 Agri-Net(最小生成树模板代码)

感觉用这题来当模板更适合。 题意就是给你邻接矩阵求最小生成树啦。~ prim代码:效率很高。172k...0ms。 #include<stdio.h>#include<algorithm>using namespace std;const int MaxN = 101;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int n

【区块链 + 人才服务】可信教育区块链治理系统 | FISCO BCOS应用案例

伴随着区块链技术的不断完善,其在教育信息化中的应用也在持续发展。利用区块链数据共识、不可篡改的特性, 将与教育相关的数据要素在区块链上进行存证确权,在确保数据可信的前提下,促进教育的公平、透明、开放,为教育教学质量提升赋能,实现教育数据的安全共享、高等教育体系的智慧治理。 可信教育区块链治理系统的顶层治理架构由教育部、高校、企业、学生等多方角色共同参与建设、维护,支撑教育资源共享、教学质量评估、

如何在Visual Studio中调试.NET源码

今天偶然在看别人代码时,发现在他的代码里使用了Any判断List<T>是否为空。 我一般的做法是先判断是否为null,再判断Count。 看了一下Count的源码如下: 1 [__DynamicallyInvokable]2 public int Count3 {4 [__DynamicallyInvokable]5 get

2、PF-Net点云补全

2、PF-Net 点云补全 PF-Net论文链接:PF-Net PF-Net (Point Fractal Network for 3D Point Cloud Completion)是一种专门为三维点云补全设计的深度学习模型。点云补全实际上和图片补全是一个逻辑,都是采用GAN模型的思想来进行补全,在图片补全中,将部分像素点删除并且标记,然后卷积特征提取预测、判别器判别,来训练模型,生成的像

【区块链 + 人才服务】区块链集成开发平台 | FISCO BCOS应用案例

随着区块链技术的快速发展,越来越多的企业开始将其应用于实际业务中。然而,区块链技术的专业性使得其集成开发成为一项挑战。针对此,广东中创智慧科技有限公司基于国产开源联盟链 FISCO BCOS 推出了区块链集成开发平台。该平台基于区块链技术,提供一套全面的区块链开发工具和开发环境,支持开发者快速开发和部署区块链应用。此外,该平台还可以提供一套全面的区块链开发教程和文档,帮助开发者快速上手区块链开发。

集中式版本控制与分布式版本控制——Git 学习笔记01

什么是版本控制 如果你用 Microsoft Word 写过东西,那你八成会有这样的经历: 想删除一段文字,又怕将来这段文字有用,怎么办呢?有一个办法,先把当前文件“另存为”一个文件,然后继续改,改到某个程度,再“另存为”一个文件。就这样改着、存着……最后你的 Word 文档变成了这样: 过了几天,你想找回被删除的文字,但是已经记不清保存在哪个文件了,只能挨个去找。真麻烦,眼睛都花了。看

MySql 事务练习

事务(transaction) -- 事务 transaction-- 事务是一组操作的集合,是一个不可分割的工作单位,事务会将所有的操作作为一个整体一起向系统提交或撤销请求-- 事务的操作要么同时成功,要么同时失败-- MySql的事务默认是自动提交的,当执行一个DML语句,MySql会立即自动隐式提交事务-- 常见案例:银行转账-- 逻辑:A给B转账1000:1.查询

开源分布式数据库中间件

转自:https://www.csdn.net/article/2015-07-16/2825228 MyCat:开源分布式数据库中间件 为什么需要MyCat? 虽然云计算时代,传统数据库存在着先天性的弊端,但是NoSQL数据库又无法将其替代。如果传统数据易于扩展,可切分,就可以避免单机(单库)的性能缺陷。 MyCat的目标就是:低成本地将现有的单机数据库和应用平滑迁移到“云”端

基于SpringBoot的宠物服务系统+uniapp小程序+LW参考示例

系列文章目录 1.基于SSM的洗衣房管理系统+原生微信小程序+LW参考示例 2.基于SpringBoot的宠物摄影网站管理系统+LW参考示例 3.基于SpringBoot+Vue的企业人事管理系统+LW参考示例 4.基于SSM的高校实验室管理系统+LW参考示例 5.基于SpringBoot的二手数码回收系统+原生微信小程序+LW参考示例 6.基于SSM的民宿预订管理系统+LW参考示例 7.基于

Lua 脚本在 Redis 中执行时的原子性以及与redis的事务的区别

在 Redis 中,Lua 脚本具有原子性是因为 Redis 保证在执行脚本时,脚本中的所有操作都会被当作一个不可分割的整体。具体来说,Redis 使用单线程的执行模型来处理命令,因此当 Lua 脚本在 Redis 中执行时,不会有其他命令打断脚本的执行过程。脚本中的所有操作都将连续执行,直到脚本执行完成后,Redis 才会继续处理其他客户端的请求。 Lua 脚本在 Redis 中原子性的原因