分布式事务方案分析:两阶段和TCC方案(图+文)

news2024/11/15 18:41:24

1 缘起

补充事务相关知识过程中,
发现,默认的知识都是基于单体服务的事务,比如ACID,
然而,在一些复杂的业务系统中,采用微服务架构构建各自的业务,
就有了分布式事务的概念,比如,一致性在单体服务和分布式服务中的场景是有一定差别的,
但是,都是为了尽最大努力保证:原子性、一致性、持久化,
单体服务中事务的一致性是强一致性,而分布式服务的事务一致性会分为:强一致性、弱一致性和最终一致性,
因此,有必要学习下分布式事务相关的知识,
分享如下,帮助轻松应对知识交流和考核。

单体服务事务相关文章:
https://blog.csdn.net/Xin_101/article/details/102246522
https://blog.csdn.net/Xin_101/article/details/102240949

2 分布式事务

2.1 为什么

为什么会有分布式事务?
既是业务问题,又是技术问题。随着业务的多元化与复杂度的增加,在技术实现层面进行了合理的业务划分,当完成业务划分后,本应该在一个会话或命令空间中的操作,散落到各个服务中,于是,有了分布式事务相关的问题。
有人会想,这不是自己给自己挖坑吗?为什么要把服务分开,都在一起不就好了?其实,对于技术实现而言,只有相对合理,没有绝对边界,在这里挖坑的土,可能是填另外一个坑的原料,虽然业务拆分有分布式等相关问题,但是,也解决了一部分其他问题,比如服务耦合、服务庞大一荣俱荣,一损俱损等(微服务带来的优势)。
关于为什么有分布式事务这个问题以及方案,不同的业务会有不同见解,不是所有业务都要考虑分布式相关的问题,因地制宜即可,我们在学习或研究某些方案的过程中,不见得会立马用到,而是为了填充我们的知识库,当遇到问题时,多一些思路,多一些方案,最终解决问题。

2.2 方案

分布式事务方案可分为两类。
(1)基于事务的分布式事务方案;
(2)基于业务的分布式事务方案。
其中,
(1)基于事务的分布式事务是将各个事务串联,并添加首先各个服务开启各自事务,然后执行CURD,将执行结果上报至统一事务管理器,统一事务管理器汇总各个事务结果,然后向各个事务发布提交或回滚的指令。
(2)基于业务的分布式事务在各自服务中维护完整的事务生命周期,与其他相关联的事务进行隔离,同时维护中间状态的数据,各个服务将各自的事务执行结果上报至统一事务管理器,统一事务管理器汇总各个事务结果,然后向各个服务发布提交或回滚的指令。
根据上述直到思想,出现了两种实际的方案:
两阶段提交和TCC。

2.1 两阶段提交(2PC,Two-phrase commit)

两阶段提交就是基于事务的分布式事务解决方案。
将分布式事务分成两个执行阶段:
(1)一阶段开启事务,执行操作;
(2)二阶段提交或回滚事务;
由统一事务管理器控制事务的执行。

2.1.1 一阶段

一阶段各个服务开启事务并执行相关的操作,将执行结果汇报给统一事务管理器,各个服务不会自动提交事务,只是上报执行结果。
一阶段执行示意图如下图所示,由图可知,
统一事务管理器接收到用户请求后,向各个本地事务管理器发送开启事务并执行CURD的指令,
在第一阶段,各个事务完成了除了提交的所有操作。

在这里插入图片描述

2.1.2 二阶段

二阶段统一事务管理器将各个服务事务的执行结果汇总,最终决定向各个事务发布提交或者回滚的指令;
(1)提交:全部服务事务执行结果均成功;
(2)回滚:任意一个服务事务出现失败;

提交

二阶段提交示意图如下图所示,由图可知,本地事务管理器将执行状态上报给统一事务管理器,
统一事务管理器综合处理后,给各个本地事务管理器发送指令,
当本地事务管理器的执行结果均成功时,统一事务管理器向各个本地事务管理器发送提交指令,
完成事务提交。
在这里插入图片描述

回滚

当任意一个本地事务管理器执行失败时,
统一事务管理器会向各个本地事务管理器发送回滚指令,
事务回滚。
在这里插入图片描述

2.1.3 存在的问题

(1)同步阻塞:当参与的事务使用公共资源时,其他事务参与者只能阻塞等待;
(2)单点故障:统一事务管理器出现故障时,整个系统不可用;
(3)数据不一致:二阶段,如果统一事务管理器只发送了提交指令,刚好网络异常,只有部分本地事务管理器接收到提交指令,另外一部分无法提交事务,数据不一致;
(4)不确定性:统一事务管理器发送提交指令后,部分本地事务管理器收到提交指令,刚好统一事务管理器和接收到提交指令的事务宕机,重新选举的统一事务管理器无法确定该消息是否提交成功。

2.2 TCC方案(Try-Confirm-Cancel)

TCC是基于业务的分布式事务方案。将完整的事务分成三个业务阶段独立维护执行:
Try-Confirm-Cancel。
其中,
Try:独立维护事务,原始数据CURD,同时操作预留数据,为后续提交或回滚做准备;
Confirm:独立维护事务,预留数据CURD,完成提交;
Cancel:独立维护事务,原始数据CURD,同时操作预留数据,完成回滚;
同样,需要一个统一事务管理器,基于业务的协调者,向各个独立的事务发布操作指令。
执行过程:
(1)提交:各个服务进入Try阶段,Try阶段全部执行成功,进入Confirm阶段,Confirm阶段全部执行成功:提交;
(2)回滚:各个服务进入Try阶段,Try阶段任意一个事务失败,进入Cancel阶段:回滚;
(3)回滚:各个服务进入Try阶段,Try阶段全部执行成功,进入Confirm阶段,Confirm阶段任意一个事务失败:回滚。

2.2.1 提交

TCC提交示意图如下图所示,由图可知,
基于业务的分布式事务,在各个服务中的各个阶段(Try,Confirm和Cancel),
维护自己的事务,执行完成后,将执行结果上报至统一事务管理器,
然后由统一事务管理器分发下一个阶段的指令。
(1)用户请求后,统一事务管理器将执行消息分发到各个服务,各个服务进入Try阶段,将Try阶段执行结果上报至统一事务管理器;
(2)统一事务管理器收集到Try阶段执行结果后,所有结果均是成功的,统一事务管理器向各个服务发送进入Confirm的指令,开始执行Confirm阶段的任务,各个服务将执行结果上报至统一事务管理器;
(3)统一事务管理器收集到Confirm阶段执行结果后,所有结果均是成功的,完成提交。

在这里插入图片描述

2.2.2 回滚

回滚则有两种情况:
(1)Try阶段异常:回滚;
(2)Confirm阶段异常:回滚;

Try阶段回滚

Try阶段回滚示意图如下图所示,由图可知,
(1)用户请求后,统一事务管理器将执行消息分发到各个服务,各个服务进入Try阶段,将Try阶段执行结果上报至统一事务管理器;
(2)统一事务管理器收集到Try阶段执行结果后,发现有Try异常,有Try正常,统一事务管理器向各个服务发送进入Cancel的指令,开始执行Cancel阶段的任务,完成回滚。
在这里插入图片描述

Confirm阶段回滚

Confirm阶段回滚示意图如下图所示,由图可知,
(1)用户请求后,统一事务管理器将执行消息分发到各个服务,各个服务进入Try阶段,将Try阶段执行结果上报至统一事务管理器;
(2)统一事务管理器收集到Try阶段执行结果后,所有结果均是成功的,统一事务管理器向各个服务发送进入Confirm的指令,开始执行Confirm阶段的任务,各个服务将执行结果上报至统一事务管理器;
(3)统一事务管理器收集到Confirm阶段执行结果后,有Confirm异常,有的Confirm正常,统一事务管理器向各个服务发送进入Cancel的指令,开始执行Cancel阶段的任务,完成回滚。
在这里插入图片描述

3 小结

(1)两阶段分布式事务方案基于事务(数据库层面)的分布式方案,TCC分布式事务方案基于业务的分布式方案;
(2)两阶段提交是强一致方案,但是仍有数据不一致的情况,统一事务管理器存在单点故障问题,导致整个系统不可用;
(3)TCC是基于业务的方案,在业务层面,业务侵入性大,实现复杂;
(4)提交:所有阶段均成功;回滚:任意阶段出现异常、失败等。


【参考文献】
[1]https://xiaomi-info.github.io/2020/01/02/distributed-transaction/
[2]https://zhuanlan.zhihu.com/p/183753774?utm_source=wechat_session
[3]https://blog.csdn.net/qq_45066628/article/details/119192658

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

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

相关文章

一站式云原生体验|龙蜥云原生ACNS + Rainbond

关于 ACNS 龙蜥云原生套件 OpenAnolis Cloud Native Suite(ACNS)是由龙蜥社区云原生 SIG 推出的基于 Kubernetes 发行版本为基础而集成的套件能力,可以提供一键式部署,开箱即用,以及丰富的云原生基础能力,…

JProfiler的使用

一、安装 从https://www.ej-technologies.com/download/jprofiler/files获取,如果需要对服务器远程分析,注意服务器版本的jprofiler和windows版本一致。 二、监控一个本地进程 2.1 不使用idea 安装之后,打开jprofiler,点击红框…

电脑蓝屏并提示BAD_POOL_CALLER怎么办?

电脑蓝屏可以说是Windows的常见问题,各种各样的终止代码对应着不同的问题。如果你的蓝屏代码显示BAD_POOL_CALLER,这篇文章就是为你提供的。 可能导致BAD_POOL_CALLER蓝屏错误的原因: 1、硬件或软件不兼容 2、过时或错误的设备驱动程序 3…

DataWorks创建JavaUDF函数全流程

文章目录插件下载创建MaxCompute Studio项目创建MaxCompute Java Module编写Java UDF函数注意说明:这篇文章只是个人记录下,具体步骤都可以在官网找到。推荐看官网文档哈 插件下载 创建MaxCompute Studio项目 启动IntelliJ IDEA,在顶部菜单栏…

1806. 还原排列的最少操作步数

解法一: 根据题目的题目描述进行模拟,遇到偶数iii将arr[i]prem[i/2]arr[i] prem[i/2]arr[i]prem[i/2],遇到奇数iii,将arr[i]prem[(n−1i)/2]arr[i]prem[(n-1i)/2]arr[i]prem[(n−1i)/2] 时间复杂度: O(n2)O(n^2)O(n2), 最多会循环n次空间复杂度&#…

Nginx反向代理使用方法小总结

文章目录一、前言二、反向代理定义重申三、短网址方式代理四、多级域名方式代理五、通配符代理方式总结一、前言 本文只介绍代理转发到一个主机的方式,至于在代理时进行负载均衡大家需要自己尝试,也比较简单,在本专栏前面文章提到过&#xf…

(二)Redis概述与安装

目录 一、概述 1、特性 2、应用场景 二、安装 三、启动 1、前台启动(不推荐) 2、后台启动(推荐) 四、redis关闭 五、redis相关知识介绍 一、概述 1、特性 Redis是一个开源的key-value存储系统。和Memcached类似&#x…

TOOM舆情分析监控管理系统集成,舆情监控系统监测那些人群?

当前,互联网已成为思想文化信息的集散地和社会舆论的扩大器,舆情监控新闻、论坛博客、聚合新闻等等,做好舆情监控,至于监测那些人群,舆情分析监控是非常必要的,接下来我们简单了解TOOM舆情分析监控管理系统…

接口协议之抓包分析 TCP 协议

TCP 协议是在传输层中,一种面向连接的、可靠的、基于字节流的传输层通信协议。环境准备对接口测试工具进行分类,可以如下几类:网络嗅探工具:tcpdump,wireshark代理工具:fiddler,charles&#xf…

《移动通信》多章节部分重要习题(简答、单选、判断)

调制技术在移动通信中的作用? 调制有两个目的: 1 )经过调制可以使基带信号变换为带通信号。选择需要使用的载波频率 ( 简称载频 ) ,可以把信号的频谱从开始的频段转移到到所需要的频段上,从而使传输信号适应信道的要求,或是可以把许多个输入信号合起来应用于多路传…

开发模型 和 测试模型 详解

开发模型 开发模型 : ① 瀑布模型 ② 螺旋模型 ③ 增量模型 和 迭代模型 ④ 敏捷模型 (优点 缺点 适用场景)测试模型 : ① V模型 ② W模型瀑布模型优点/特点:线性结构,每个阶段 只执行一次是其他模型的一个基础框架缺点&#xff1…

sentinel-Roadmap(三)

Pages 60 Sentinel 官方网站 OpenSergo 微服务治理 文档 Read Me新手指南Sentinel 介绍FAQRoadmap如何使用工作原理流量控制集群流控(分布式流控)网关流控熔断降级热点参数限流系统自适应限流黑白名单控制实时监控数据动态规则控制台生产环境使用 Sent…

Spring依赖注入时,创建代理bean和普通bean详解

问题来源 以前一直有个疑惑,为什么我创建的controller中注入的service类有时候是代理类,有时候是普通javabean,当时能力不够,现在已经有了点经验就大胆跟了跟源码,看看到底咋回事。 首先看看问题现象: a1…

linux nfs umount报错:device is busy

执行nfs卸载命令umount /mnt,报错target is busy. 或device is busy可以按以下步骤检查:退出要卸载挂载的目录,再执行卸载挂载cd ../umount /mnt找出占用目录的端口,kill端口fuser -m /mnt/kill -9 端口umount /mnt停止nfs服务&am…

PCA 主成分分析-清晰详细又易懂

PCA(Principal Component Analysis)通过线性变换将原始数据变换为一组各维度线性无关的表示,可用于提取数据的主要特征分量,常用于高维数据的降维。 当然我并不打算把文章写成纯数学文章,而是希望用直观和易懂的方式叙…

Java char[]数组转成String类型(char to String)详细介绍

前言 string toCharArray() 方法将给定的字符串转换为字符序列 Java中字符串转换为字符数组的方法在之前的博客已经介绍了! 今天介绍char[]数组转成String 方法有4种: 使用 String 类的 valueOf() 方法使用字符串连接使用 Character 类的 toString() 方…

图形编辑器:场景坐标、视口坐标以及它们之间的转换

大家好,我是前端西瓜哥。 图形编辑器的坐标系有两种。 一个是场景(scene)坐标系,一个是 视口(viewport)坐标系。视口就是场景的一个子区域。 假设我们的视口的原点,离场景原点的坐标水平和垂直…

C2芯片一ESP32-C2开发板

C2是一个芯片采用4毫米x 4毫米封装,与272 kB内存。它运行框架,例如ESP-Jumpstart和ESP造雨者,同时它也运行ESP-IDF。ESP-IDF是Espressif面向嵌入式物联网设备的开源实时操作系统,受到了全球用户的信赖。它由支持Espressif以及所有…

月报总结|Moonbeam 12月份大事一览

本月,针对生态和项目,Moonbeam基金会启动首期Accelerator Program孵化计划,将针对入选团队提供一系列扶持资源,申请仍在开放中。对于开发者,Moonbuilders Academy上线了关于构建跨链应用的新课程。 社区活动方面&…

【案例分析】汽车制造行业电能质量治理方案分析

摘要:现如今的汽车制造行业,使用的机械设备越来越精密,制造技术与自动化水平也越来越高,为此对供电系统的电能质量要求更高更苛刻,同时对不能满足现有生产工艺需求的供电质量进行治理。通过分析汽车制造过程中冲压工艺…