基于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.mfbz.cn/a/559358.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Scanpy(2)多种可视化

本篇内容为scanpy的可视化方法,可以分为三部分: embedding的散点图;用已知marker genes的聚类识别(Identification of clusters);可视化基因的差异表达; 我们使用10x的PBMC数据集(…

全新Linux教程-驱动大全-PCI和PCIe子系统-P5-PCIe设备的配置过程

1 PCIe系统硬件结构 注意:在pci设备中,可以通过引脚选中设备,但是在PCIe设备中,由于是端对端的配置过程(endpoint to endpoint)。PCIe桥中有很多端口,端口可以直接连接PCIe设备。在设备之间只有…

python连接数据库1

1、建立简单的数据库连接(前提是有数据库) from pymysql import Connection connConnection(host localhost, #主机名 /ip地址 127.0.0.1port3306, #端口,默认为这个userroot, #账户名password123456 #密码,自己的密码 ) #打印相…

施耐德 M340 PWM1 功能块使用方法

功能块帮助文档:《EcoStruxure™ Control Expert - 控制 , 功能块库》https://www.schneider-electric.cn/zh/download/document/33003687K01000/输出处理 --> PWM1:脉宽调制 功能块样式、引脚 EN BOOL 输入。1使能功能块,0不使能功能块…

14.基础乐理-音级、基本音级、变化音级

音级: 乐音体系中的每一个音,都叫 音级。 基本音级: 基本音级是 CDEFGAB 它们七个,在钢琴上使用白键展示的,没有任何升降号、没有任何重升重降号的。 变化音级: 除了 CDEFGAB 这七个音,都叫变化…

利用Python进行大规模数据处理

👽发现宝藏 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 利用Python进行大规模数据处理:Hadoop与Spark的对比 随着数据量的不断增长&…

web网站搭建实验

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

Android RecyclerView的LayoutManager配置

RecyclerView的item布局方式依赖于其配置的布局管理器。不同的布局管理器可以实现不同的界面效果。 LayoutManager介绍 RecyclerView可以通过setLayoutManager设置布局管理器,该方法的源码如下: /*** Set the {link LayoutManager} that this RecyclerV…

JAVA 项目<果园之窗>_1

这几天有空看能不能把水果店管理系统整出来,目标是整个网页版本的,以我的电脑做服务器,数据存在mysql中 以我目前的理解整个项目大致可分为前端部分、后端部分、数据库部分,也就这三个部分 目前打开并运行了一个别人的项目&#…

Linux下SPI设备驱动实验:验证读写SPI设备中数据的函数功能

一. 简介 前面文章实现了 SPI设备驱动框架,并在此基础上添加了字符设备驱动框架,实现了读 / 写SPI设备中数据的函数,文章如下: Linux下SPI设备驱动实验:向SPI驱动框架中加入字符设备驱动框架代码-CSDN博客 Linux下…

2024年学浪的缓存怎么导出来

在自我成长的道路上,越来越多的朋友选择通过精选课程来提升自己。然而,面对那些服务期限有限的课程,怎样才能把握住知识的光芒,让它照亮未来的每一个角落?本文就教大家如何利用工具下载学浪app平台的课程 工具我已经打…

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

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

C++奇迹之旅:深入理解赋值运算符重载

文章目录 📝赋值运算符重载🌠 运算符重载🌉特性 🌠 赋值运算符重载🌠传值返回:🌠传引用赋值:🌉两种返回选择🌉赋值运算符只能重载成类的成员函数不能重载成全…

用Gold-yolo模块改进yolov8模型

gold-yolo论文: https://arxiv.org/pdf/2309.11331.pdf gold-yolo代码: https://github.com/huawei-noah/Efficient-Computing/tree/master/Detection/Gold-YOLO 一 gold模块简介 Gold-Yolo是华为诺亚方舟实验室2023年发布的工作,主要优化检…

Linux程序的地址空间,进程终止

个人主页:点我进入主页 专栏分类:C语言初阶 C语言进阶 数据结构初阶 Linux C初阶 算法 欢迎大家点赞,评论,收藏。 一起努力,一起奔赴大厂 一.程序的地址空间 1.1程序的地址空间的引入 我们知道frok可以创建…

重塑我们对随机性在计算中的作用的理解

2023年图灵奖,最近刚刚颁给普林斯顿数学教授 Avi Wigderson!作为理论计算机科学领域的领军人物,他对于理解计算中的随机性和伪随机性的作用,作出了开创性贡献。 Avi Wigderson 的履历 自 1999 年以来,Wigderson 一直担…

Python五子棋VS人机对战

上一次编写了一个python五子棋游戏,但是属于玩家之间的对战。今天介绍五子棋和人机对战。本博文目的是教学和一些毕业设计。 目前电脑下棋逻辑算法还是比较简单的,不能和市面上五子棋相提并论,请大家理想对待! 代码: import pygame import sys import tkinter as tk fro…

再拓信创版图-Smartbi Insight V11与东方国信CirroData数据库完成兼容适配认证

近日,思迈特商业智能与数据分析软件 [简称:Smartbi Insight] V11与北京东方国信科技股份有限公司 (以下简称东方国信)CirroData-OLAP分布式数据库V2.14.1完成兼容性测试。经双方严格测试,两款产品能够达到通用兼容性要…

python语言零基础入门——注释、print()函数、input()函数

目录 一、注释 1.块注释 2.行内注释 3.多行注释 二、打印变量 1.print()函数:输出/打印指定内容 2.input()函数:输入指定内容 三、编程题:个人名片 一、注释 1.块注释 以#开始,直到本行结束都是注释为了保证代码的可读性…

初步学习node.js文件模块

环境已安装好; 写一个read1.js如下; var fs require("fs"); var data ;// 创建一个流 var stream1 fs.createReadStream(test1.jsp); stream1.setEncoding(UTF8);// 绑定data事件 stream1.on(data, function(mydata) {data mydata; });/…
最新文章