基于TCC的分布式事务

news2025/1/11 19:49:40

优质博文:IT-BLOG-CN

一、分布式事务简介

分布式的架构中,分布式的事务是一个绕不过的挑战,微服务理念的流行让分布式的问题日益突出。 在公司内部, 笔者所接触的管理系统中实际上也存在着分布式事务。 这里假设有这三个系统(cim、xfunds、cert)存在客户的同步问题。cim系统系统签约用户时,分别调用cert和xfunds远程发布的客户端接口进行新增用户,这里简单模拟下这个过程:

//cim 系统签约用户(cim本地事务)
public void doCimSignUser(User user){
	certClient.addUser(user); //新增成功
	xfundsClient.addUser(user); //新增失败,导致和cert系统数据不一致
}

cim的接口开发人员发现上述问题后让笔者开发了一个删除用户的接口,于是代码逻辑如下:

public void doCimSignUser(User user){
	certClient.addUser(user);
	try {
		xfundsClient.addUser(user);
	} catch(Exception e){
		certClient.deleteUser(user); //祈祷cert这个接口调用成功
	}
}

上述的处理方式,对于分布式事务而言属于纯补偿性的处理方式,但是仍然存在问题是 cert的删除用户接口也有可能调用失败,从数据一致性上考虑这种处理的方式也是不安全的。

其实对于分布式事务很早就有组织提出过技术解决方案,那就是 X/Open组织提出的 DTP模型:
在这里插入图片描述
上述的接口规范不针对于具体的语言,对于java 而言,落实上述规范就是JTA(Java Transaction API)。但是这种规范并没有得到广泛的应用,主要是由于性能和单点故障问题。有兴趣小伙伴可深入了解,这里给出两个可参考的网址:
1、2PC(两阶段提交协议):http://book.51cto.com/art/201309/410608.htm
2、JTA:http://nesta2001zhang.iteye.com/blog/1146509

蚂蚁金服CTO程立早年的一篇关于分布式事务的PPT,有关于大规模SOA系统中各种分布式事务处理方案,里面提出了分布式事务的处理的三种方案,本文主要讨论其中之一的TCC方案的实现,具体PPT的参考网址如下:https://wenku.baidu.com/view/be946bec0975f46527d3e104.html

二、tcc

TCC事务机制相对于传统事务机制(2PC),其特征在于它不依赖资源管理器(RM)对XA的支持,而是通过对(由业务系统提供的)业务逻辑的调度来实现分布式事务,因此tcc是属于应用层的一种实现机制,更加轻量。

TCC事务机制需要业务系统提供三段业务逻辑:初步操作Try、确认操作Confirm、取消操作Cancel,如下图:
在这里插入图片描述
【1】TCC事务机制以初步操作(Try)为中心的,确认操作(Confirm)和取消操作(Cancel)都是围绕初步操作(Try)而展开。因此,Try阶段中的操作,其保障性是最好的,即使失败,仍然有取消操作(Cancel)可以将其不良影响进行回撤。
【2】确认操作(Confirm)是对初步操作(Try)的一个补充。当TCC事务管理器决定commit全局事务时,就会逐个执行初步操作(Try)指定的确认操作(Confirm),将初步操作(Try)未完成的事项最终完成。
【3】大取消操作(Cancel)是对初步操作(Try)的一个回撤。当TCC事务管理器决定rollback全局事务时,就会逐个执行初步操作(Try)指定的取消操作(Cancel),将初步操作(Try)已完成的事项全部撤回。

三、tcc-transation

tcc-transaction是TCC型事务java实现框架,从github上的排名上可以看出它被使用的欢迎程度,截止于笔者写这篇文章的时间2024年4月15, 它的star排名如下图:
在这里插入图片描述
更多该框架的使用以及实现原理,请参考:https://github.com/changmingxie/tcc-transaction 。笔者学习分布式架构时,利用此框架模拟解决了文章开头时的三个系统的客户同步时分布式事务问题。自己搭建了一套基于SpringBoot + dubbo + tcc transation + beetlsql 的分布式应用框架,欢迎与大家进行交流学习。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1609723.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Redis从入门到精通(二十二)Redis原理之数据结构、网络模型、通心协议、内存回收

文章目录 第8章 Redis原理8.1 Redis数据结构8.1.1 RedisObject8.1.2 动态字符串(SDS)8.1.3 string8.1.4 List8.1.5 Set8.1.6 ZSet8.1.7 Hash 8.2 Redis网络模型8.2.1 五种网络模型介绍8.2.1.1 用户空间和内核空间8.2.1.2 阻塞IO8.2.1.3 非阻塞IO8.2.1.4 …

第二证券策略:股指预计维持震荡格局 关注金融、工程建设等板块

第二证券指出,一季度GDP同比增加5.3%,符合我们早前5%—5.5%的预测。边际上看,3月工业增加值、社零总额、出口同等比增速均显着回落,主要是1—2月阶段性提振因素衰退(如闰年、集中假日、新年错位等)以及去年…

LeetCode in Python 200. Number of islands (岛屿数量)

岛屿数量既可以用深度优先搜索也可以用广度优先搜索解决,本文给出两种方法的代码实现。 示例: 图1 岛屿数量输入输出示意图 方法一:广度优先搜索(bfs) 代码: class Solution:def numIslands(self, grid):if not grid:return 0…

回应评论区剪映疑问

关于这篇文章 插件以及对应版本剪映重新打包整理: 链接:https://pan.baidu.com/s/1D2-pH1JhecGFxiTyFb6tGQ?pwd2k5n 提取码:2k5n 单独需要插件资源:链接:https://pan.baidu.com/s/1NsIyfAZTO3arnBzFdNBizQ?pwdri…

JWT和Redis比较选型

一、Session 二、JWT 三、比较 基于JWT(JSON Web Token)和Session身份验证之间的争论是现代 Web 开发中的一个要点。 JWT 身份验证:无状态。服务器生成一个令牌,客户端存储该令牌并随每个请求一起提供,服务端仅需按照…

提取点云-------PCL

提取点云 /// <summary> /// VoxelGrid滤波下采样 /// </summary> /// <param name"cloud">需要滤波的点云</param> /// <param name"lx">三维体素栅格的x</param> /// <param name"ly">三维体素栅格…

分布式系统——全站监控

文章目录 全站监控要点**监控范围与对象****监控指标与数据****监控工具与技术****监控策略与实践****全站监控的价值** 实例展示 全站监控要点 全站监控是针对分布式架构中所有组件和服务进行全方位、多层次、实时的性能监控、状态检测和故障告警的系统化方法。在分布式环境下…

Linux系统——Zabbix监控

目录 前言 一、Zabbix概述 1.简介 2.监控原理 3.Zabbix由哪两部分组成 4.主要特点 5.运行机制 6.监控对象 7.监控模式 8.Zabbix程序 9.Zabbix架构 9.1Server-Client 9.2Server-Proxy-Client 9.3Master-Node-Client 二、Zabbix-Server安装与部署 1.环境准备 2.…

vue3的一般使用

vue3的一般使用 ** 1.子组件写模版时 可以省略props

【SpringBoot实战篇】获取用户详细信息

1 明确需求 1需要获取用户详细信息 2 接口文档 1基本信息 2请求参数 无 3 响应数据 响应数据类型&#xff1a;application/json 响应参数说明&#xff1a; 响应数据样例 3 思路分析 1用户名在请求头里获取 4 开发 4.1 控制器usercontroller GetMapping("/userInfo")p…

C/C++易错知识点(4):static修饰变量和函数

static是C/C中一个非常容易混淆的语法&#xff0c;在不同的地方针对不同的对象有不同的效果。 它在大型项目中有至关重要的作用&#xff0c;需要我们详细研究。 1.变量 所有static修饰的变量的生命周期都是自调用它起到程序结束&#xff0c;期间这些变量都只会初始化一次 ①…

yolov8实战第七天——pyqt5-yolov8实现车牌识别系统(参考论文(约7000字)+环境配置+完整部署代码+代码使用说明+训练好的模型)

基于 pyqt5-yolov8实现车牌识别系统,包括图片车牌识别,视频车牌识别,视频流车牌识别。 效果展示(图片检测,检测到的内容添加到历史记录): 效果展示(视频检测,视频车辆只会添加一条记录,下文更多实际应用中的优化策略): 基于YOLOv8和PyQt5的车牌识别系统设计与…

Linux 操作系统非缓冲区的文件操作、时间编程

1、文件操作 1.1 基于缓冲区的文件操作 基于缓冲区的文件操作---高级Io 以f开头的是基于缓冲区的文件操作 printf是一个基于缓冲区的函数 输出条件&#xff1a; 1.程序正常运行 2.遇到换行\n也能输出 3.缓存区内存已满 1024大小 4.遇到fflush&#xff08;stdout&a…

【每日刷题】Day19

【每日刷题】Day19 &#x1f955;个人主义&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; 目录 1. 55. 跳跃游戏 - 力扣&#xff08;LeetCode&#xff09; 2. 62. 不同路径 - 力扣&#xff08;LeetCode&#xff09; 3. 63. 不同路径…

48-PCIE转串口和并口电路设计

视频链接 PCIE转串口和并口电路设计01_哔哩哔哩_bilibili PCIe转串口和并口电路设计 1、PCIe转串并口电路设计基本介绍 2、PCIe转串口和并口的方案(京东) 2.1、PCIe转串口 2.1.1、ASIX (亚信)MCS9922-PCIe转2路RS232扩展卡 2.1.2、ASIX (亚信)MCS9900-PCIe转4路RS232扩展卡…

【ARM 裸机】I.MX 启动方式之启动头文件 2

接上一节&#xff1a;【ARM 裸机】I.MX 启动方式之启动头文件 1&#xff1b; 2.3、DCD DCD&#xff0c;Device Configuration Data &#xff0c;就是配置 6ULL 寄存器的&#xff0c;DCD 数据最大限制 1768 字节&#xff1b; CCGR0 是不是很熟悉&#xff1f;对&#xff0c;在…

C++实战——日期类的实现

日期类的实现 前言一、日期类概念实现运用场景 二、日期类的具体实现代码构造函数拷贝构造函数获取日期&#xff08;内联函数&#xff09;赋值加等减等加减小于小于等于大于大于等于相等不相等前置后置前置- -后置- -关于类里重载的比较运算符为什么要加外部const示例 Date.hDa…

鸢尾花数据集的KNN探索与乳腺癌决策树洞察

鸢尾花数据集的KNN探索与乳腺癌决策树洞察 今天博主做了这个KNN和决策树的实验。 一.数据集介绍 介绍一下数据集&#xff1a; 威斯康星州乳腺癌数据集&#xff1a; 威斯康星州乳腺癌数据集&#xff08;Wisconsin Breast Cancer Dataset&#xff09;是一个经典的机器学习数…

git 快问快答

我在实习的时候&#xff0c;是用本地开发&#xff0c;然后 push 到 GitHub 上&#xff0c;之后再从 Linux 服务器上拉 GitHub 代码&#xff0c;然后就可以了。一般程序是在 Linux 服务器上执行的&#xff0c;我当时使用过用 Linux 提供的命令来进行简单的性能排查。 在面试的时…

YMP实现Oracle迁移到YashanDB

迁移需求 ip地址 数据库信息 操作系统信息 源库 192.168.3.132 实例名topdh 用户密码TOPICIS/oracle 端口1521 Centos7.9 x86_64 目标库 192.168.3.175 实例名yasdb 用户密码topicist/opicis 端口1688 Centos7.9 x86_64 迁移前准备 YMP工具获取 根据实际需求向厂…