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

news2025/6/28 8:50:24

针对不同的分布式场景业界常见的解决方案有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.coloradmin.cn/o/1822494.html

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

相关文章

Tensorflow入门实战 T04-猴痘识别

本篇文章主要:tensorflow 运行环境:本地cpu 运行epoch:50 1、tensorflow官网 tensorflow的官网教程。初学者的 TensorFlow 2.0 教程 | TensorFlow Core 官网上有图像分类的相关详细描述还有代码示例。 2、完整代码展示 from tensorflo…

进阶篇04——视图

简介及基本语法 视图的检查选项 可以通过视图进行数据的增删改查操作,但由于视图是一张虚拟表,所以操作的实际上是视图的基表,即创建视图时select语句操作的表 cascaded 自己还测试了一下这种情况:当V1和V2都没有加检查选项&…

华三HCL模拟器安装及华三防火墙配置

0、前言 最近跟模拟器杠上了,主要是需要运行防火墙,目前已经成功模拟出华为、山石防火墙,而且模拟出来的设备能与物理网络环境进行互联。现在我又盯上华三防火墙了。 首先下载模拟器: 下载地址:H3C网络设备模拟器官方免…

EasyExcel文件导出,出现有文件但没有数据的问题

一开始由于JDK版本过高,我用的17,一直excel没有数据,表头也没有,后来摸索了好久,找了资料也没有,后来改了代码后报了一个错误(com.alibaba.excel.exception.ExcelGenerateException: java.lang.…

进程状态及其转换

0号进程(idle):在linux系统启动的时候最先运行的进程就是0号进程,0号进程又叫空闲进程。如果系统上没有其他进程执行那么0号进程就执行。0号进程是1号进程和2号进程的父进程 1号进程(init):init进程是由0号进程创建得到的,它的主要工作是系统的初始化。…

Spring Security 与 JWT、OAuth 2.0 整合详解:构建安全可靠的认证与授权机制

Spring Security 与 OAuth 2.0 整合详解:构建安全可靠的认证与授权机制 将 JWT(JSON Web Token)与 OAuth 2.0 整合到 Spring Security 中可以为应用程序提供强大的认证和授权功能。以下是详细的整合步骤和代码示例。 1. 引入依赖 首先&am…

【开源项目】重庆智慧城市案例~实景三维数字孪生城市CIM/BIM

飞渡科技数字孪生重庆管理平台,以实景三维平台为支撑,以城市数据库对接为核心,利用数字孪生技术,结合云计算、物联网IOT等技术,对接城市规划、智能交通、和公共安全等系统。 利用平台强大的国产自研渲染引擎&#xff0…

怎么压缩视频大小

在数字时代,视频已成为我们日常生活和工作中不可或缺的一部分。然而,视频文件的大小也越来越大,这给存储和传输带来了不小的挑战。因此,学会如何有效地压缩视频文件,就显得尤为重要。本文将详细介绍一种常用的视频压缩…

vscode中模糊搜索和替换

文章目录 调出搜索(快捷键)使用正则(快捷键)替换(快捷键)案例假设给定文本如下目标1:查找所有函数名目标2:替换所有函数名为hello目标3:给url增加查询字符串参数 调出搜索…

Coursera耶鲁大学金融课程:Financial Markets 笔记Week 01

Financial Markets 本文是学习 https://www.coursera.org/learn/financial-markets-global这门课的学习笔记 这门课的老师是耶鲁大学的Robert Shiller https://en.wikipedia.org/wiki/Robert_J._Shiller Robert James Shiller (born March 29, 1946)[4] is an American econ…

如何用Xcode创建你的第一个项目?学起来

前言 上一期,咱们已经有安装XCode的教程了。有小伙伴说建议跳过,嗯。。。如果你对开发很熟悉,那可以。但如果不熟悉,建议还是按照教程一步步来哦! 毕竟统一了开发工具,咱们后续讲的内容学习起来也会简单一…

U-Mail反垃圾邮件网关助力企业抵御垃圾邮件,守护邮箱安全

在数字化时代,电子邮件已成为企业沟通不可或缺的工具,它在促进信息流通和提高工作效率方面扮演着关键角色。然而,随着电子邮件使用的普及,垃圾邮件问题也日益凸显,特别是那些携带恶意软件或钓鱼链接的邮件,…

2024 年最新 Python 调用 OpenAi 详细教程实现问答、图像合成、图像理解、语音合成、语音识别(详细教程)

OpenAi 环境安装 首先确保您的计算机上已经安装了 Python。您可以从 Python 官方网站下载并安装最新版本 Python。安装时,请确保勾选 “Add Python to PATH” (添加环境变量)选项,以便在 cmd 命令行中直接使用 Python。 安装 Op…

如何将ai集成到项目中,方法二

上一篇文章:如何将ai集成到radsystems项目中,在项目中引入ai-CSDN博客 上一篇文章内容主要针对于未实现权限分离的项目,这篇文章主要来说一下权限分离的项目怎么做,以及注意的细节。 一、编写前端router.js 二、编写前端askai.vu…

qemu microvm 测试运行记录

[v3] Introduce the microvm machine type | Patchew 下载获取rootfs wget http://dl-cdn.alpinelinux.org/alpine/v3.10/releases/x86_64/alpine-minirootfs-3.10.2-x86_64.tar.gz qemu-img create -f raw alpine-rootfs-x86_64.raw 1G losetup /dev/loop0 alpine-rootfs-x86…

服务器哪些因素会影响到网站SEO优化?

您是否曾想过,您的 SEO 性能下降,可能是网站服务器出了问题?鉴于此,在本文中,我们将探讨哪些服务器因素会影响您网站的 SEO,并提供可行的建议。 页面速度 搜索引擎非常看重您网站的加载速度。加载缓慢的网站会给用户体…

jenkins使用注意问题

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

SY7304DBC 丝印VI DFN-10 33V,4A,1MHz升压稳压器芯片

在智能手机中,SY7304DBC 这类升压调节器可以有以下一些具体的使用案例: 1. 显示屏背光控制: 智能手机的显示屏背光需要一个稳定的电流来保持亮度均匀。SY7304DBC 可以在此应用场景中用于提供恒定的电流,确保屏幕清晰可见而不受电池电压波动的…

除了ps我们还可以使用什么方法来处理图片?

照片模糊了怎么办?当照片拍的不好时,容易出现模糊的状况,其实照片模糊了可以通过后期软件加工处理,但是ps操作很复杂,对我们有一定的技术基础要求,那么有没有别的图片处理工具呢? ps它的图片处理功能较为全…

【论文阅读笔记】LeSAM: Adapt Segment Anything Model for medical lesion segmentation

1.论文介绍 LeSAM: Adapt Segment Anything Model for medical lesion segmentation LeSAM:适用于医学病变分割的任意分割模型 2024年发表于 JBHI Paper 无code 2.摘要 Segment Anything Model,SAM是自然图像分割领域的一个基础性模型,取得…