分布式事务的八种方案解析(1)

针对不同的分布式场景业界常见的解决方案有2PC、TCC、可靠消息最终一致性、最大努力通知等方案,以下总结8 种常见的解决方案,帮助大家在实际的分布式系统中更好地运用事务。

1.2PC

二阶段提交协议(Two-phase commit protocol),简称 2PC。2PC是将整个事务流程分为两个阶段:

● 1.准备阶段(Prepare phase)

● 2.提交阶段(commitphase)

2是指两个阶段,P是指准备阶段,C是指提交阶段

在计算机中部分关系数据库如Oracle、MySQL支持两阶段提交协议,如下图:

● 准备阶段(Prepare phase):事务管理器给每个参与者发送Prepare消息,每个数据库参与者在本地执行事务,并写本地的Undo/Redo日志,此时事务没有提交。(Undo日志是记录修改前的数据,用于数据库回滚,Redo日志是记录修改后的数据,用于提交事务后写入据文件)

● 提交阶段(commit phase):如果事务管理器收到了参与者的执行失败或者超时消息时,直接给每个参与者发送回滚(Rollback)消息;否则,发送提交(Commit)消息;参与者根据事务管理器的指令执行提交或者回滚操作,并释放事务处理过程中使用的锁资源。

注意:必须在最后阶段释放锁资源

下图展示了2PC的两个阶段,分成功和失败两个情况说明:

成功情况:

异常情况:

2PC优缺点:

优点

● 简单直观:逻辑清晰,易于理解和实现。

● 原子性保证:能够保证跨多个分布式节点的事务的原子性。

缺点:

● 同步阻塞:因为一阶段需要锁定数据库资源,等待二阶段结束才释放,性能较差,在高并发场景下不适用

● 单点故障问题,如果协调者在第二阶段崩溃,参与者可能会无限期地等待指令,因为它们不知道应该提交还是回滚。这使得整个系统容易受到单点故障的影响

● 数据不一致问题,如果在第二阶段中协调者向某些参与者发送了提交指令,而其他参与者因为网络问题没有收到指令,那么这些没有收到指令的参与者可能会选择回滚,导致数据不一致

2.3PC

3PC,即Three-Phase Commit,是一种分布式事务协议,用于在分布式系统中确保多个参与者之间的事务操作的一致性和可靠性。它是在两阶段提交(2PC)协议的基础上发展而来,解决了2PC协议可能出现的悬挂事务问题。

3PC协议将提交操作分为三个阶段,分别是准备阶段、提交准备阶段和提交阶段,每个阶段都有对应的操作和协议。

准备阶段(CanCommit):

● 协调者:向所有参与者发送CanCommit准备请求,询问它们是否可以提交事务。

● 参与者:执行本地事务,检查是否能够执行,如果可以执行则返回可以提交,否则返回不可以提交。

提交准备阶段(PreCommit):

● 协调者: 根据参与者的反馈情况决定是否进行提交准备

○ 如果所有参与者都返回“可以提交”,协调者向所有参与者发送提交请求,告知它们可以进行提交准备。

○ 如果有任何参与者返回“不可以提交”或者超时未响应,则协调者向所有参与者发送中止请求,取消事务。

提交阶段(DoCommit/DoAbort):

● 如果协调者 接收到所有参与者的确认提交消息,则向所有参与者发送最终的提交请求,提交事务。

● 如果协调者接收到任何参与者的中止请求,或者在提交准备阶段超时未收到所有参与者的响应,则向所有参与者发送中止请求,取消事务

3PC协议相对于2PC协议的改进在于增加了一个准备阶段,使得参与者在准备阶段就能够知道是否可以提交事务,从而避免了悬挂事务问题。然而,3PC协议仍然存在着协调者单点故障、消息丢失等问题,因此在实际应用中并不常见,一般更多地使用2PC、Saga等分布式事务解决方案

3.TCC

TCC是Try、Confirm、Cancel三个词语的缩写,TCC要求每个分支事务实现三个操作:预处理Try、确认Confirm、撤销Cancel。Try操作业务检查及资源预留,Confirm做业务确认操作,Cancel实现一个与Try相反的操作即回滚操作。TM首先发起所有的分支事务的try操作,任何一个分支事务的try操作执行失败,TM将会发起所有分支事务的Cancel操作,若try操作全部成功,TM将会发起所有分支事务的Confirm操作,其中Confirm/Cancel操作若执行失败,TM会进行重试。

● 分支事务成功情况:

● image分支事务失败的情况:

imageTCC分为三个阶段

● Try 阶段:是做业务检查(一致性)及资源预留(隔离),此阶段仅是一个初步操作,它和后续的Confirm 一起才能真正构成一个完整的业务逻辑。

● Confirm 阶段:是做确认提交,Try阶段所有分支事务执行成功后开始执行 Confirm。通常情况下,采用TCC则认为 Confirm阶段是不会出错的。即:只要Try成功,Confirm一定成功。若Confirm阶段真的出错了,需引入重试机制或人工处理。。

● Cancel 阶段:是在业务执行错误需要回滚的状态下执行分支事务的业务取消,预留资源释放。通常情况下,采用TCC则认为Cancel阶段也是一定成功的。若Cancel阶段真的出错了,需引入重试机制或人工处理

TCC需要注意三种异常处理

空回滚

在没有调用 TCC 资源 Try 方法的情况下,调用了二阶段的 Cancel 方法,Cancel 方法需要识别出这是一个空回滚,然后直接返回成功。

出现原因:是当一个分支事务所在服务宕机或网络异常,分支事务调用记录为失败,这个时候其实是没有执行Try阶段,当故障恢复后,分布式事务进行回滚则会调用二阶段的Cancel方法,从而形成空回滚。

解决思路是

关键就是要识别出这个空回滚。思路很简单就是需要知道一阶段是否执行,如果执行了,那就是正常回滚;如果没执行,那就是空回滚。

幂等

TCC二阶段提交重试机制不会引发数据不一致,要求 TCC 的二阶段 Try、Confirm 和 Cancel 接口保证幂等,这样不会重复使用或者释放资源。如果幂等控制没有做好,很有可能导致数据不一致等严重问题。

解决思路 在上述“分支事务记录”中增加执行状态,每次执行前都查询该状态。

悬挂

悬挂就是对于一个分布式事务,其二阶段 Cancel 接口比 Try 接口先执行。

出现原因: 在 RPC 调用分支事务try时,先注册分支事务,再执行RPC调用,如果此时 RPC 调用的网络发生拥堵,通常 RPC 调用是有超时时间的,RPC 超时以后,TM就会通知RM回滚该分布式事务,可能回滚完成后,RPC 请求才到达参与者真正执行,而一个 Try 方法预留的业务资源,只有该分布式事务才能使用,该分布式事务第一阶段预留的业务资源就再也没有人能够处理了,对于这种情况,我们就称为悬挂,即业务资源预留后没法继续处理。

解决思路:如果二阶段执行完成,那一阶段就不能再继续执行。在执行一阶段事务时判断在该全局事务下,“分支事务记录”表中是否已经有二阶段事务记录,如果有则不执行Try。

TCC优缺点:

TCC的优点:

● 一阶段完成直接提交事务,释放数据库资源,性能好

● 无需使用全局锁,性能最强

● 不依赖数据库事务,而是依赖补偿操作,可以用于非事务型数据库

TCC的缺点

● 有代码侵入,需要人为编写try、Confirm和Cancel接口,太麻烦

● 软状态,事务是最终一致

● 需要考虑Confirm和Cancel的失败情况,做好幂等处理

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

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

相关文章

好用的视频压缩软件

在当今数字化时代,视频已成为我们日常生活中不可或缺的一部分。无论是工作、学习还是娱乐,视频都扮演着重要的角色。视频的存储空间也越来越大,这给我们的设备存储带来了不小的挑战。因此,学习如何将视频压缩小点成为了一项实用的…

叁[3],VM二次开发异常处理

1,开发环境 VS2022/WPF/.NetFramework4.8 VM4.2 2,"模块状态0,错误码10100005,错误信息:模块与平台不匹配" 现象描述: 1,WPF/NetFramework项目中打开方案,对工具做模板&#xff0c…

开源可视化表单可以用在哪些行业中?

很多客户朋友会询问我们,什么样的行业可以使用低代码技术平台及开源可视化表单?其实,随着社会的进步和发展,很多中小型企业都希望通过低代码技术平台能够让企业实现提质增效的目的,也想借助它的优势特点进入流程化办公…

怎么提升机器人外呼的转化效率

在某些情况下,如市场调查、产品推广等,语音机器人可以高效地完成大量的呼叫任务,并能通过预设的语音脚本和智能识别功能,初步筛选和分类潜在客户。此时,不转人工可能更为高效和经济。 然而,在一些需要深度沟…

jenkins使用注意问题

1.在编写流水线时并不知道当前处在哪个目录,导致名使用不当,以及文件位置不清楚 流水线任务默认路径是,test4_mvn为jenkins任务名 [Pipeline] sh (hide)pwd /var/jenkins_home/workspace/test4_mvn maven任务也是,看来是一样的…

【SpringBoot整合系列】SpringBoot整合kinfe4j

目录 kinfe4j与Swagger的区别 SpringBoot2.x整合kinfe4j1.添加依赖2.启动类注解3.创建Knife4J配置类4.实体类5.接口admin访问 api访问 常用注解汇总SpringBoot3.x整合Kinfe4j启动报错解决1.更换依赖2.启动类3.配置4.配置类5.参数实体类6.接口admin访问 api访问 各版本注解参照 …

树莓派4B学习笔记8:开机自启动Python脚本_kill关闭后台脚本

今日继续学习树莓派4B 4G:(Raspberry Pi,简称RPi或RasPi) 本人所用树莓派4B 装载的系统与版本如下: 版本可用命令 (lsb_release -a) 查询: Opencv 版本是4.5.1: 紧接着上篇文章学习的串口通信,今日学习如何让树莓派开机…

【方法】如何解除PDF“打开密码”?

很多人会给PDF文件设置密码保护,防止文件被随意打开。那如果后续想要解除“打开密码”,如何操作呢? 首先,我们要分两种情况来看,一种是知道密码的情况下,不需要保护文件了,也就是不想每次打开P…

若依Ruoyi-vue和element admin的区别,该如何选择。

提到中后台的前端框架,每个人都能列举出很多,这其中提及率比较高的就是Ruoyi和element admin两款,很多小伙伴分不清二者,本文为大家详细讲解一下。 一、若依Ruoyi-vue是什么? 若依Ruoyi-Vue是一款基于 Vue.js 开发的…

React基础教程:TodoList案例

todoList案例——增加 定义状态 // 定义状态state {list: ["kevin", "book", "paul"]}利用ul遍历list数组 <ul>{this.state.list.map(item ><li style{{fontWeight: "bold", fontSize: "20px"}} key{item.i…

DAC测试实验——FPGA学习比

一、DAC简介 DAC全称Digital to Analog Converter&#xff0c;即数模转换器。它用于将主控芯片产生的数字值(0和1)转换为模拟值(电压值)。 1、DAC参数指标 2、DAC类型 常用的DAC可大致分为权电阻网络DAC、T型电阻网络DAC、倒T型电阻网络DAC以及权电流型DAC。 3、AD9708/3PD9…

Idea jdk配置的地方 启动时指定切换的地方

jdk 配置的地方 项目sdk 所在位置 管理添加或删除的地方&#xff0c;增加后&#xff0c;可以在在上面切换 启动时指定版本

基于机器学习的CFD模型降阶

降阶模型 ROM 降阶模型ROM&#xff08;Reduced Order Models&#xff09;是一种对高保真度静态或动态模型的简化方法。模型降阶在保留了模型的基本特性与主导效应的同时&#xff0c;大大减少复杂模型的CPU计算时间及存储空间。 ROM的用途&#xff1a; 加速大规模系统的仿真速度…

pytorch学习笔记7

getitem在进行索引取值的时候自动调用,也是一个魔法方法,就像列表索引取值那样,一个意思 import torchvision from torch.utils.data import DataLoaderdata_transformtorchvision.transforms.Compose([torchvision.transforms.ToTensor()] ) test_datatorchvision.datasets.C…

C++面向对象:多态性

多态性 1.概念 多态性是面向对象的程序设计的一个重要特征。在面向对象的方法中一般是这样表述多态的&#xff1a;向不同的对象发送同一个信息&#xff0c;不同的对象在接收时会产生不同的行为。也就是说&#xff0c;每个对象用自己的方式去响应共同的消息。 2.典例 下面这…

R语言绘制三变量分区地图

参考资料&#xff1a; https://mp.weixin.qq.com/s/5c7gpO2mJ2BqJevePJz3CQ tricolore包教程&#xff1a;https://github.com/jschoeley/tricolore 学习笔记&#xff1a;Ternary choropleth maps 1、测试实例 代码&#xff1a; library(ggplot2) library(rnaturalearthdata) …

android studio4.1后不能ButterKnife

麻蛋L最近发现 android studio不能使用ButterKnife啦&#xff01;ButterKnife Injections不维护&#xff0c;butterknife Zelezny也不维护&#xff01;&#xff01;&#xff01;日…难受&#xff0c;兄弟们换下一家&#xff1a;IDsCreate&#xff0c;一毛一样的好用&#xff01…

TCP/IP协议简要介绍

TCP/IP for IP version 4&#xff08;IPv4&#xff09;是一种网络协议&#xff0c;Microsoft Windows使用该协议通过internet与其他计算机进行通信。理想情况下&#xff0c;只要基于Windows的计算机通过网络进行通信&#xff0c;就会使用TCP/IP。 本文介绍TCP/IP协议的组成、协…

蓝牙模块与其他无线技术的比较与选择

在无线通信技术日新月异的今天&#xff0c;蓝牙模块、WiFi、Zigbee和NFC等技术都发挥着至关重要的作用。它们在智能设备、工业自动化、智能家居等多个领域得到广泛应用&#xff0c;各自拥有独特的优点和局限性。本文将对这几种无线技术进行详细的比较&#xff0c;分析它们的优缺…

接口自动化测试工程化——了解接口测试

什么是接口测试 接口测试也是一种功能测试 我理解的接口测试&#xff0c;其实也是一种功能测试&#xff0c;只是平时大家说的功能测试更多代指 UI 层面的功能测试&#xff0c;而接口测试更偏向于服务端层面的功能测试。 接口测试的目的 测试左移&#xff0c;尽早介入测试&a…