基于TCC的分布式事务

优质博文: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.mzph.cn/bicheng/833.shtml

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

相关文章

解线性方程组——直接解法:(Gauss)高斯消去法、列主元、全主元 | 北太天元

一、问题描述 对于线性方程组 A x b , A ( a 11 a 12 ⋯ a 1 n a 21 a 22 ⋯ a 2 n ⋮ ⋮ ⋮ a n 1 a n 2 ⋯ a n n ) , b ( b 1 b 2 ⋮ b n ) Axb,\quad A\begin{pmatrix} a_{11} & a_{12} &\cdots &a_{1n}\\ a_{21} & a_{22} &\cdots &a_{2n}\\…

win11家庭中文版安装docker遇到Hyper-V启用失败,如何解决??

🏆本文收录于「Bug调优」专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&…

PyQt程序:实现新版本的自动更新检测及下载(FTP服务器实现)

一、实现逻辑 本实例采用相对简单的逻辑实现,用户在客户端使用软件时点击“检测升级”按钮,连接至FTP服务器检索是否有新版本的.exe,如果有,下载最新的.exe安装升级。 本实例服务端待下载.exe所在目录结构 本实例客户端待更新.exe所在目录结构 二、搭建服务器 可以参考…

3. 无重复字符的最长子串/438. 找到字符串中所有字母异位词/560. 和为 K 的子数组

3. 无重复字符的最长子串 给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 输入: s "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。 思路:想象一下我们…

90天精通Psim仿真--经典实战教程--第10天 Simcode DSP28335 LED控制

PSIM (Power Simulation) 是一款电力电子和电机控制仿真软件,而DSP28335是德州仪器(TI)的一款数字信号处理器(DSP)。如果你想要在PSIM的SimCoder环境中为DSP28335生成LED闪烁的代码,遵循以下步骤: 打开PSIM并创建模型: 首先,在PSIM中创建一个电路模型,该模型应包括DS…

贪心(贪婪)算法

主要思想 贪心算法的思想主要可以概括为“总是做出当前看起来最优的选择”,也就是不从整体上进行考虑,所得到的答案是某种意义上的局部最优解,不一定是整体最优解。 贪心算法没有固定算法框架,算法设计的关键是贪心策略的选择。…

AI原生时代,操作系统为何是创新之源?

一直以来,操作系统都是软件行业皇冠上的明珠。 从上世纪40、50年代,汇编语言和汇编器实现软件管理硬件,操作系统的雏形出现;到60年代,高级编程语言和编译器诞生,开发者通过操作系统用更接近人的表达方式去…

方程豹春季品牌发布会:全家族矩阵献礼比亚迪

春意盎然的四月,深圳也迎来了中国新能源汽车领域的一场盛事。 4月16日,作为比亚迪旗下全球首个专业个性化汽车品牌,方程豹在深圳隆重举办春季发布会。 在这场以“方华”为主题的发布会上,方程豹汽车全家族矩阵首次集体亮相&#x…

【数据结构】单链表经典算法题的巧妙解题思路

目录 题目 1.移除链表元素 2.反转链表 3.链表的中间节点 4.合并两个有序链表 5.环形链表的约瑟夫问题 解析 题目1:创建新链表 题目2:巧用三个指针 题目3:快慢指针 题目4:哨兵位节点 题目5:环形链表 介绍完了…

美化博客文章(持续更新)

🎁个人主页:我们的五年 🔍系列专栏:游戏实现:贪吃蛇​​​​​​ 🌷追光的人,终会万丈光芒 前言: 该文提供我的一些文章设计的一些方法 目录 1.应用超链接 1.应用超链接

mysql in查询优化

都说in查询比较慢,要改成子查询模式,ChatGPT大模型告诉了我,SQL中替换In查询的10种方法,太赞了,按照这个说的集中方法,验证一下。因为实际项目中确实存在in很多的情况。 查询执行的先后顺序对优化有必要&am…

【EI会议征稿】2024年先进机械电子、电气工程与自动化国际学术会议(ICAMEEA 2024)

2024 International Conference on Advanced Mechatronic, Electrical Engineering and Automation ●会议简介 2024年先进机械电子、电气工程与自动化国际学术会议(ICAMEEA 2024)将汇聚全球机械电子、电气工程与自动化领域的专家学者,共同…

计算机网络:CSMA/CA协议

计算机网络:CSMA/CA协议 CSMA/CA概述帧间间隔工作原理退避算法虚拟载波监听 CSMA/CA概述 讲解CSMA/CA之前,我们回顾一下CSMA/CD的三个特性: 多址接入MA:多个主机连接在一条总线上,竞争使用总线 载波监听CS&#xff1a…

web网站搭建实验

综合练习:请给openlab搭建web网站 网站需求: 1.基于域名www.openlab.com可以访问网站内容为 welcome to openlab!!! 2.给该公司创建三个子界面分别显示学生信息,教学资料 和缴费网站,基于,www.openlab.com/data网站…

X-314智能合约:金融创新的强大引擎

💥火爆到烫手的X-314智能合约🔥 X-314智能合约是基于以太坊区块链开发的,具有高度可定制性和灵活性。 ave开单独板块;详细资料已经准备好;对web3感兴趣的大佬货;多交流多指导🤝 ​X-314智能合…

JUC(java.util.concurrent) 的常见类

Callable 接口 Callable 的用法 Callable 是一个 interface(类似之前的 Runnable,用来描述一个任务,但是没有返回值)也是描述一个任务的,有返回值。方便程序猿借助多线程的方式计算结果. 例如:创建线程…

Zynq7000系列中PL时钟使用

可编程逻辑(PL)具有自己的时钟管理生成和分配功能,并从处理器系统(PS)中的时钟发生器接收四个时钟信号(如图25-10所示)。 在嵌入式系统中,PL时钟的管理和分配对于确保逻辑电路的正确…

QT跨平台读写Excel

QT跨平台读写Excel 背景Excel工具CMakeLists.txt工程目录 背景 开发框架QT,makefile构建工具CMake,编译器MinGW Excel工具 考虑跨平台则不能使用针对微软COM组件的QAxObject来读写Excel,因此使用开源QtXlsx。 这里是将QXlsx当做源码嵌入使…

使用FastDDS编译IDL文件

1.安装FastDDS环境 Ubuntu22.04 1.1安装依赖的软件 sudo apt-get update //基础工具安装 sudo apt install cmake g python3-pip wget git //Asio 是一个用于网络和低级 I/O 编程的跨平台C库,它提供了一致的 异步模型。 TinyXML2是一个简单,小巧&…

Redis进阶——GEO地理坐标附近商户案例

目录 GEO数据结构的基本用法GEO概述GEO命令的使用GEO数据结构练习 导入店铺数据到GEO业务场景实现代码如下 实现附近商户功能 GEO数据结构的基本用法 GEO概述 GEO就是Geolocation的简写形式,代表地理坐标。Redis在3.2版本中加入了对GEO的支持,允许存储…