基于TCC的分布式事务

devtools/2024/9/23 3:27:56/

优质博文:IT-BLOG-CN

一、分布式事务简介

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

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

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

java">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.ppmy.cn/devtools/4075.html

相关文章

HTML 入门 ( 一 )

HTML文档创建 首先创建一个txt文本文档 修改文件后缀 HTML标签 标签结构 标签又称为元素,是HTML的基本组成单位分为: 双标签与单标签推荐小写标签名 结构: 双标签示例代码: <marquee> My name is Kvein. </marquee>单标签示例代码: <input>标签的并列与嵌…

server_id 引发的 MySQL 级联复制同步异常

MySQL 级联复制的坑&#xff0c;我帮你们踩了。 作者&#xff1a;蒋士峰&#xff0c;爱可生 DBA 团队成员&#xff0c;熟悉 MySQL&#xff0c;Oracle 等数据库。每天的积累&#xff0c;时间久了&#xff0c;会带来不一样的收货。 爱可生开源社区出品&#xff0c;原创内容未经授…

欧拉公式;傅里叶变换;耳朵:声波(音频)眼睛:光波(图像) 大脑:傅里叶快速变换

目录 复分析 复数指数函数 欧拉公式 a点向量,方向和长度的向量;

信息系统项目管理师0056:数据管理(4信息系统管理—4.2管理要点—4.2.1数据管理)

点击查看专栏目录 文章目录 4.2管理要点4.2.1数据管理1.数据战略2.数据治理3.数据架构4.数据应用5.数据安全6.数据质量7.数据标准8.数据生存周期9.理论框架与成熟度4.2管理要点 信息系统管理涉及系统准备、设计、实施、运行等活动的众多方面,

深入理解高并发超卖一系列问题与解决方案(近7万字详解,跳槽涨薪必备宝藏珍藏级分享)

破除困境带你飞 能遇上高并发的&#xff0c;基本都是有点规模的公司&#xff0c;小公司基本都是CRUD。 想去一线城市跳槽&#xff0c;想去有高并发的公司&#xff0c;但是没有高并发经验&#xff0c;没有高并发的经验&#xff0c;就去不了高并发的公司&#xff0c;去不了这样的…

mq如何保证消息队列的消息不丢失?高可用?

在消息队列&#xff08;MQ&#xff09;系统中&#xff0c;确保消息不丢失和高可用是非常重要的特性。以下是一些常见的策略和机制来实现消息的持久性和系统的高可用&#xff1a; 保证消息不丢失 消息持久化&#xff1a;将消息保存到磁盘&#xff0c;在系统崩溃后依然能够恢复消…

Unity给地图物体添加对撞机

在项目/Assets下创建Prefabs文件夹 选择素材拖入层级下&#xff0c;注意此时地图素材有可能看不到&#xff0c;此时选择Tilemap在检查器中修改图层顺序调至最低。 添加对撞机 选择素材&#xff0c;在检查器中点击添加组件Box Collider 2D&#xff0c;将素材拖入Prefabs文件下…

20240415金融读报:市场信贷不能过于宽松声音碳领域新增文件

1、市场普遍认为&#xff0c;在经济转型背景下&#xff0c;当前的社会融资规模和信贷增长有助于经济高质量发展&#xff0c;过于宽松并不利于经济发展。&#xff08;已经有这个声音了&#xff0c;是不是说明我们已经脱离了U型曲线的最低点&#xff0c;在或快接近其后半段的1/2处…