基于TCC的分布式事务

优质博文: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/embedded/10831.html

相关文章

关于使用docx-preview来实现预览word文件的功能(我用的若依框架)

最近公司让做一个关于内容预览的功能 1.刚开始怎么弄 一开始在网上搜集了大量资料,基本上都不符合关于我的要求,不过最后还是找到了,话不多说,直接上关键步骤 1.1 安装docx-preview # 正常安装 npm install docx-preview --sa…

火绒安全概述

页面简介: 火绒安全是一款集多种安全功能于一体的国产软件,旨在为用户提供全面的计算机保护。本页面将详细介绍火绒安全的核心功能和使用方式。 页面内容概览: 杀毒防护 实时监控:详细介绍火绒安全如何实时检测系统中的文件和程序…

设计模式-桥接模式

背景 手机操作问题 现在对不同手机类型的不同品牌实现操作编程(比如:开机、关机、上网,打电话等),如图: 传统方案解决手机使用问题(类图): 传统方案解决手机操作问题分析 扩展性问题(类爆炸),如果我们再增加手机的样式(旋转式),就需要增加各个品牌手机的类&#…

【机器学习】分类与预测算法的评价与优化

以实际案例解析F1值与P-R曲线的应用 一、分类算法与性能评价的重要性二、F1值与P-R曲线的概念与意义三、实例解析:以垃圾邮件检测为例四、代码实现与结果分析五、结论与展望 在数据驱动的时代,机器学习算法以其强大的数据处理和分析能力,成为…

Rust 使用结构体组织相关联的数据

目录 结构体的定义和实例化 使用字段初始化简写语法使用结构体更新语法从其他实例创建实例使用没有命名字段的元组结构体来创建不同的类型没有任何字段的类单元结构体结构体示例程序 通过派生 trait 增加实用功能方法语法 定义方法带有更多参数的方法关联函数多个 impl 块本文有…

开源协议的对比和商业上的安全使用

开源协议的对比和商业上的安全使用 开源组件是:“任何人都可以自由使用、更改和共享(以修改或未修改的形式)的软件”。当今企业依靠开源来加速开发、降低成本和推动创新。对开放源码的糟糕管理可能会使组织面临安全、法律和操作风险。 使用…

重学java 19.面向对象 继承 上

走不出的那段阴霾,很多时候只不过是,我们把它当成了唯一 —— 24.4.22 面向对象整体知识导向: 知识梳理: 1.知道继承的好处 2.会使用继承 3.继承之后成员变量和成员方法的访问特点 4.方法的重写,知道方法重写的使用场景…

海信发布《黑神话:悟空》定制电视E8N新品,重塑大屏游戏体验

4月17日,在“AI美好生活”2024海信电视E8系列新品发布会上,海信电视官宣成为《黑神话:悟空》全球官方合作伙伴。同时,海信电视还为广大游戏玩家带来了《黑神话:悟空》的显示CP,推出了官方定制电视——旗舰新…

论文略读:SWE-bench: Can Language Models Resolve Real-world Github Issues?

iclr 2024 oral reviewer评分 5668 现有的语言模型(LMs)的基准测试已经饱和,无法捕捉到最先进的语言模型能做什么和不能做什么的前沿。 ——>要具有挑战性的基准测试论文引入了SWE-bench 在现实软件工程环境中评估语言模型的基准测试 ​​…

开源大模型应该怎么选?

文章目录 前言为什么选择开源模型而不是商业模型?开源模型对比Llama 2Mixtral 8x7BZephyr 7BSOLAR 10.7BCode Llama 专用 Vs. 通用生产环境部署LLMs 的注意事项 前言 在过去的一年里,人工智能领域不断涌现出各种大语言模型(LLMs),每个模型都在不断突破生…

超实用的Web兼容性测试经验总结,建议Mark

在日常工作中,我们经常碰到网页不兼容的问题。我们之所以要做兼容性测试,目的在于保证待测试项目在不同的操作系统平台上正常运行。 主要包括待测试项目能在同一操作系统平台的不同版本上正常运行;待测试项目能与相关的其他软件或系统的“和…

【HarmonyOS】Stage 模型 - 基本概念

一、项目结构 如图1所示: 图1 从项目结构来看,这个应用的内部包含了一个子模块叫 entry,模块是应用的基本功能单元,它里面包含源代码、资源、配置文件等。 像这样的模块在应用内部可以创建很多。但模块整体来讲就分成两大类&am…

关联规则挖掘(二)

目录 三、FP-增长算法(一)算法的背景(二)构造FP-树(三)生成频繁项集 四、关联规则的评价(一)支持度和置信度的不足(二)相关性分析 三、FP-增长算法 &#xf…

3D抓取算法的介绍

3D抓取算法是一个用于三维点云数据上物体抓取的基线算法。该算法基于深度学习,利用点云数据来预测最佳的抓取点,以便机器人或其他自动化系统能够执行精确的抓取操作。 以下是关于3D抓取算法的详细介绍: 1. 数据输入 3D抓取算法通常接受三维…

OpenHarmony实战开发-减小应用包大小。

简介 减小应用包大小是提升应用下载、安装体验的重要方式之一。通过压缩、精简或者复用应用中的代码或资源,可以有效降低应用的大小,提升应用下载和安装速度,减少系统空间占用。 开发者可以参考下面三种方法减小应用包大小: 配…

NLP预训练模型

NLP预训练模型(Natural Language Processing pre-training model)是一种通过无监督学习方式在大规模文本数据上进行训练的模型。这些模型通常采用深度学习的方法,如自编码器、语言模型等,通过学习语言的统计规律和语义信息&#x…

java 词法分析练习

import parser.Parser;import java.util.ArrayList; import java.util.Arrays; import java.util.List;public class Main {public static void main(String[] args) {// 关键词List<String> keyList new ArrayList<>(Arrays.asList("int","String…

【InternLM 实战营第二期笔记06】Lagent AgentLego 智能体应用搭建

一、智能体的由来 为什么要有智能体呢&#xff1f;这主要源于大语言模型存在的局限性。尽管大语言模型在人工智能领域取得了显著的进步&#xff0c;但它们仍然面临着一些重要的问题。 智能体可以通过学习和优化算法&#xff0c;不断提升自身的性能。它们可以从历史数据中学习…

Linux下给Oracle补丁下载

下载oracle补丁 登入Oracle support网站&#xff1a; https://support.oracle.com/portal/ 查询文档编号&#xff1a;2118136.2&#xff0c; 选择需要的补丁编号&#xff0c;选择对应的版本&#xff0c;提前阅读 readme和download 下载opatch工具 查询文档293369.1 ##Orac…

【设计模式】中介模式

目录 什么是中介模式 中介模式的组成 使用场景&#xff1a; 优点&#xff1a; 缺点&#xff1a; Java 示例代码&#xff1a; 什么是中介模式 Java 中的中介模式&#xff08;Mediator Pattern&#xff09;是一种行为型设计模式&#xff0c;旨在降低多个对象和类之间的通信…