分布式事务原子性-TCC

news2024/11/24 5:52:35

一、分布式事务-原子性

随着数据量不断的变大,单机所能处理的数据总归是有上限的,所以现阶段分布式的应用系统在各个领域中遍地生花。接下来我们就来聊一下分布式系统中非常重

要的特性分布式事务的原子性功能。之前没有了解过分布式相关知识的读者可以阅读以下专栏“分布式算法”。

问:那么什么是分布式原子性呢?

答:在分布式系统中,分布式事务是指跨越多个独立的计算机或服务节点的一系列操作。这些操作必须以原子性进行,要么全部执行成功,要么全部回滚,保持数

据的一致性和完整性。原子性是分布式事务的关键特性之一,它确保了事务的不可分割性和一致性。具体来说,原子性要求一个事务中的所有操作要么都成功地被提交,要么都被完全撤销。

让我看一下詹姆斯·尼古拉·格雷James Nicholas "Jim" Gray)的定义吧:

Atomicity: Either all the changes from the transaction occur (writes, and messages sent), or none occur.

上面那段话还是比较难懂的,特别是messages sent,但是不妨碍我们理解核心思想即原子性要么全部做完,要么都不做。

例子:某天温州的小杨准备给北京的小李转10万块钱,结果因为x行系统故障,导致了小李获得了10万,并且小杨的账号没有减少10万,两个人开心的不行。

上述其实就是因为“小杨扣钱”和“小李获钱”的操作没有捆绑起来导致的后果,这种操作是会导致银行破产,要么被客户骂死,风险是极大的。

那么上述问题我们该如何解决呢?下面我们介绍一下如何解决该问题的两个协议(TCC和2PC),本次内容先介绍TCC,后续介绍2PC。

二、TCC协议

TCC 全称即Try-Confirm-Cancel,由Pat Helland于2007年在一篇名为“Life beyond Distributed Transactions: an Apostate’s Opinion”的论文中首次提出。

从名字中我们可以看出,其将事务分为三个步骤:尝试(Try)、确认(Confirm)和取消(Cancel),来确保分布式系统中的事务操作的可靠性和一致性。

  • Try:事务参与者会尝试(Try)预留所有必要的资源,并执行一些前置检查。如果所有的资源都可用且检查通过,则可以继续到下一个阶段。否则,如果任何资源不可用或检查失败,则事务参与者会返回错误或异常。

  • Confirm:事务参与者会提交之前预留的资源,并执行实际的业务逻辑操作。这些操作可能会修改数据库、发送消息等。如果所有操作都成功完成,事务参与者会发送确认(Confirm)信号。

  • Cancel :如果在确认阶段发生错误或者出现异常情况,需要进行事务的回滚。在取消阶段(Cancel),事务参与者会释放之前预留的资源,并执行相应的回滚操作,以使整个事务回滚到初始状态。

TCC只是一个协议,具体的实现还需要结合实际场景(考虑网络延迟、幂等性、重试机制等方面的问题)进行。

2.1 TCC角色

虽然TCC的实现很多细节,但是当中涉及了三个角色。

  • Transaction Initiator: 事务发起者是整个分布式事务的发起方,负责协调和控制整个事务的执行流程。它引导和驱动事务的执行,并与参与者节点进行通信,最终决定是否提交或回滚整个事务。

  • Transaction Participant:事务参与者是分布式事务中的各个执行单元,负责执行具体的事务操作。每个参与者都实现了与协调者交互的Try、Confirm和Cancel方法。在Try阶段,参与者预留资源并执行前置检查;在Confirm阶段,参与者执行实际的业务操作;在Cancel阶段,参与者回滚之前的操作。

  • Coordinator:协调者是事务发起者与事务参与者之间的中间节点,负责协调各个参与者的行为,确保整个事务的一致性和原子性。协调者与每个参与者节点进行通信,根据收集到的确认和取消信息,决定最终提交或回滚事务。(好多实现,去掉了这个角色,直接通过Transaction Initiator完成)

下面给出一个Orcale 事务架构师Todd Little案例,通过MicroTx的介绍角色。下图中的Microservice A即是Transaction Initiator,Microservice B和Microservice B即为Transaction Participant,而Coordinator就是协调者确保事务的一致和原子,让大家统一进行confirm和Cancel。

2.2 优缺点分析

优点:

  • TCC协议相对于传统的两阶段提交(2PC)协议,具有更好的可扩展性和灵活性。

  • 具有更高的并发性和没有长时间的锁等待

缺点:

  • 代码对业务逻辑的嵌入性太强

  • 更高的开发需求,因为我们需要提供尝试/确认/取消接口。

2.2 案例说明

下面介绍TCC如何介绍开篇提出的问题。

  • 正常交易流程

  • 异常交易处理方式

    首先尝试去锁定需要的资源,这时候由于Service C异常了,其try对应资源失败,返回no;Service B正常响应,返回yes。由于Transaction Participant中响应了no,那么事务管理器向所有Transaction Participant发出cannel指定,从而保障所有操作都不执行。

     

三、参考资料

1、詹姆斯·尼古拉·格雷关于事务的介绍 https://amturing.acm.org/info/gray_3649936.cfm

2、用go语言实现TCC https://betterprogramming.pub/a-tcc-distributed-transaction-made-easy-with-go-c0a38d2a8c44、

3、Making Try-Confirm/Cancel Easy with MicroTx https://blogs.oracle.com/database/post/making-try-confirmcancel-easy-with-microtx

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

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

相关文章

一文带你迅速了解下Spring中的AOP

1. 什么是AOP? AOP(Aspect Oriented Programming):面向切面编程。 面向切面编程是一种思想,其实就是对某一类事情进行统一的处理。而 SpringAOP就是一种AOP的具体实现的框架。这就好比 IOC 和 DI 一样的关系。 上述就是对登录功…

Excel(1):表头或列头冻结

1.需求 对于较大的excel,通常需要固定一部分内容,另一份内容为可翻动。 2.解决方式 在视图中选择冻结窗格,需要注意的是,选择冻结窗格时,窗格的左上方的表格区域是固定不动的,只可以向下或者向右活动。

NPM与外部服务的集成(上)

目录 1、关于访问令牌 1.1 关于传统令牌 1.2 关于粒度访问令牌 2、创建和查看访问令牌 2.1 创建访问令牌 在网站上创建传统令牌 在网站上创建粒度访问令牌 使用CLI创建令牌 CIDR限制令牌错误 查看访问令牌 在网站上查看令牌 在CLI上查看令牌 令牌属性 1、关于访问令…

Ubuntu22关闭中上方弹出的消息提醒,Ubuntu22关闭开机后中上方弹出的消息提醒:logged in as a privileged user

一、问题描述 Ubuntu22关闭中上方弹出的消息提醒,Ubuntu22关闭开机后中上方弹出的消息提醒:logged in as a privileged user 二、问题分析 此弹出框为消息通知提示,关闭相应的消息通知即可 三、解决方案 1、打开设备 2、打开消息通知&…

c语言作业

作业一: 作业二: if语句后可以跟多条语句,用大括号括起来就行。 if语句中0表示假,非0表示真。 if语句是一种分支语句,可以实现单分支,也可以实现多分支。 else语句不一定和它的对齐的if语句相匹配。 …

Android应用开发(37)LTPO帧率测试基于Surfaceview

Android应用开发学习笔记——目录索引 参考android官网: Frame rate | Android media | Android Developers多重刷新率 | Android 开源项目 | Android Open Source ProjectWindowManager.LayoutParams | Android Developers 目前市面上旗舰手机基本都是…

AirServer是什么软件,手机屏幕投屏电脑神器

什么是 AirServer? AirServer 是适用于 Mac 和 PC 的先进的屏幕镜像接收器。 它允许您接收 AirPlay 和 Google Cast 流,类似于 Apple TV 或 Chromecast 设备。AirServer 可以将一个简单的大屏幕或投影仪变成一个通用的屏幕镜像接收器 ,是一款…

手势识别rtos小车(2)----蓝牙通信

在pycharm下面安装pybluez库 本人:win11python3.8pybluez2 第一步,直接在pycharm终端运行 pip install pybluez 一般都会直接报错 第二步,下载安装win11的SDK文件,Windows SDK - Windows 应用开发 | Microsoft Developer 第三步…

面试热题(验证二叉搜索树)

给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下: 节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子树和右子树自身必须也是二叉树 二叉树满足以上3个条件&#xff0c…

SpringMVC关于SSM的整合配置步骤

🐌个人主页: 🐌 叶落闲庭 💨我的专栏:💨 c语言 数据结构 javaweb 石可破也,而不可夺坚;丹可磨也,而不可夺赤。 SSM整合 一、创建工程1.1创建Maven工程1.2工程命名1.3检查…

Ubuntu常用配置

文章目录 1. 安装VMware虚拟机软件2. 下载Ubuntu镜像3. 创建Ubuntu虚拟机4. 设置屏幕分辨率5. 更改系统语言为中文6. 切换中文输入法7. 修改系统时间8. 修改锁屏时间9. 通过系统自带的应用商店安装软件10. 安装JDK11. 安装 IntelliJ IDEA12. 将左侧任务栏自动隐藏13. 安装docke…

机器学习终极指南:特征工程(01/2) — 第 -2 部分

西姆兰吉特辛格 一、介绍 欢迎来到“机器学习终极指南”的第二部分。在第一部分中,我们讨论了探索性数据分析 (EDA),这是机器学习管道中的关键步骤。在这一部分中,我们将深入研究特征工程,这是机器学习过程…

fiddler抓包工具的用法以及抓取手机报文定位bug

前言: fiddler抓包工具是日常测试中常用的一种bug定位工具 一 抓取https报文步骤 使用方法: 1 首先打开fiddler工具将证书导出 点击TOOLS------Options------Https-----Actions---选中第二个选项 2 把证书导出到桌面后 打开谷歌浏览器 设置---高级…

如何让你的图片服务也有类似OSS的图片处理功能

原文链接 前言 有自己机房的公司一般都有一套存储系统用于存储公司的图片、视频、音频、文件等数据,常见的存储系统有以NAS、FASTDFS为代表的传统文件存储,和以Minio为代表的对象存储系统,随着云服务的兴起很多公司逐渐将数据迁移到以阿里云…

MySql012——检索数据:创建计算字段(拼接字段、使用别名、执行算术计算)

准备工作1:在study库中创建表vendors,并插入数据 说明:vendors表包含供应商名和位置信息。 use study;CREATE TABLE vendors (vend_id int NOT NULL AUTO_INCREMENT,vend_name char(50) NOT NULL ,vend_address char(50) NULL ,…

SpringBootWeb案例

通过该综合案例,我们就可以知道,在开发一个Web程序时,前端程序、后端程序以及数据库这三者之间是如何交互、如何协作的,而通过这个综合案例也需要掌握根据接口文档开发服务端接口的能力。 而这个案例呢,就是Tlias智能学习辅助系统。 产品经理所绘制的页面原型: 在这个案…

postman测试后端增删改查

目录 一、本文介绍 二、准备工作 (一)新建测试 (二)默认url路径查看方法 三、增删改查 (一)查询全部 (二)增加数据 (三)删除数据 (四&…

Faker库详解 - Python中的随机数据生成器

文章目录 Faker介绍Faker安装Faker使用基本使用方法随机生成人物相关的基础信息随机生成地理相关的信息随机生成网络相关的信息随机生成日期相关的信息随机生成数字/字符串/文本随机生成列表/元组/字典/集合/迭代器/json随机生成文件相关的信息随机生成颜色/表情每次请求获取相…

1.作用域

1.1局部作用域 局部作用域分为函数作用域和块作用域。 1.函数作用域: 在函数内部声明的变量只能在函数内部被访问,外部无法直接访问。 总结: (1)函数内部声明的变量,在函数外部无法被访问 (2)函数的参数也是函数内部的局部变量 (3)不同函数…

测试老鸟经验总结,Jmeter性能测试-重要指标与性能结果分析(超细)

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 Aggregate Report …