.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

相关文章

windos server2022的配置故障转移服务的图文教程

《windosserver2022的配置故障转移服务的图文教程》本文主要介绍了windosserver2022的配置故障转移服务的图文教程,以确保服务和应用程序的连续性和可用性,文中通过图文介绍的非... 目录准备环境:步骤故障转移群集是 Windows Server 2022 中提供的一种功能,用于在多个

解决systemctl reload nginx重启Nginx服务报错:Job for nginx.service invalid问题

《解决systemctlreloadnginx重启Nginx服务报错:Jobfornginx.serviceinvalid问题》文章描述了通过`systemctlstatusnginx.se... 目录systemctl reload nginx重启Nginx服务报错:Job for nginx.javas

java如何分布式锁实现和选型

《java如何分布式锁实现和选型》文章介绍了分布式锁的重要性以及在分布式系统中常见的问题和需求,它详细阐述了如何使用分布式锁来确保数据的一致性和系统的高可用性,文章还提供了基于数据库、Redis和Zo... 目录引言:分布式锁的重要性与分布式系统中的常见问题和需求分布式锁的重要性分布式系统中常见的问题和需求

Redis事务与数据持久化方式

《Redis事务与数据持久化方式》该文档主要介绍了Redis事务和持久化机制,事务通过将多个命令打包执行,而持久化则通过快照(RDB)和追加式文件(AOF)两种方式将内存数据保存到磁盘,以防止数据丢失... 目录一、Redis 事务1.1 事务本质1.2 数据库事务与redis事务1.2.1 数据库事务1.

Golang使用etcd构建分布式锁的示例分享

《Golang使用etcd构建分布式锁的示例分享》在本教程中,我们将学习如何使用Go和etcd构建分布式锁系统,分布式锁系统对于管理对分布式系统中共享资源的并发访问至关重要,它有助于维护一致性,防止竞... 目录引言环境准备新建Go项目实现加锁和解锁功能测试分布式锁重构实现失败重试总结引言我们将使用Go作

Redis分布式锁使用及说明

《Redis分布式锁使用及说明》本文总结了Redis和Zookeeper在高可用性和高一致性场景下的应用,并详细介绍了Redis的分布式锁实现方式,包括使用Lua脚本和续期机制,最后,提到了RedLo... 目录Redis分布式锁加锁方式怎么会解错锁?举个小案例吧解锁方式续期总结Redis分布式锁如果追求

SpringBoot嵌套事务详解及失效解决方案

《SpringBoot嵌套事务详解及失效解决方案》在复杂的业务场景中,嵌套事务可以帮助我们更加精细地控制数据的一致性,然而,在SpringBoot中,如果嵌套事务的配置不当,可能会导致事务不生效的问题... 目录什么是嵌套事务?嵌套事务失效的原因核心问题:嵌套事务的解决方案方案一:将嵌套事务方法提取到独立类

.NET利用C#字节流动态操作Excel文件

《.NET利用C#字节流动态操作Excel文件》在.NET开发中,通过字节流动态操作Excel文件提供了一种高效且灵活的方式处理数据,本文将演示如何在.NET平台使用C#通过字节流创建,读取,编辑及保... 目录用C#创建并保存Excel工作簿为字节流用C#通过字节流直接读取Excel文件数据用C#通过字节

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应用案例

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