分布式事务方案学习

news2024/12/1 0:40:37

第100篇文章啦!分布式事务在面试中分布式事务也是十分重要的点,所以学习完分布式锁后我们就来学习分布式事务吧。

事务表示的是我们在业务逻辑中对数据库进行操作的一组单元,需要同时成功或同时失败,不了解的小伙伴们可以看一下下面的文章。

Spring事务及工作中的使用

一般的事务可以在一个微服务中对于数据库的操作进行管理,但在多个微服务间调用时会失效,如下场景:

所以此时我们就需要用到分布式事务的解决方案。

分布式事务解决方案思路分析

我们可以对各个微服务调用的结果进行保存,当各个微服务应用业务流程执行后不提交事务,而是回到总的调用者中,由调用者对各个事务进行判断,所有服务的结果都正确时,才会给各个系统发送信息,各个系统进行事务提交

这种思路就是2pc提交协议2pc提交就是将整个事务提交过程分为两个阶段,由事务协调者进行判断,第一个阶段为执行业务逻辑,将业务逻辑的执行结果返回给事务协调者第二个阶段为提交执行事务,如果各个服务的业务执行结果都为同意则提交事务,如果有一个服务执行结果失败了则回滚

这种方式其实是有缺点的:

1.单点故障事务协调者出错,会导致事务失败,会出问题,可以通过集群解决

2.阻塞资源:因为各个服务执行业务逻辑的时长不同,在分布式事务中,事务协调者会等待所有服务响应后进行事务处理,也就是说所有服务都需要等待处理时间最长的服务调用结束,事务协调者给出结果之后才能继续向下执行提交或回滚,在之前微服务线程会一直被阻塞,数据库连接也会一直被占用解决方案是第一阶段直接提交,对原数据进行备份,如果第二阶段是回滚,则根据备份的原数据进行还原,这是seata(阿里巴巴的分布式事务框架)对2pc提交协议的优化-AT模式

3.数据不一致:当二阶段事务协调者发送提交信息的时候,此时某个微服务报错了,这时此服务的数据则丢失,不会被提交解决方案可以通过人工介入,可以通过运维处理,也可以通过脚本进行数据对照进行更新或回退

在2pc的基础上,又衍生除了3pc提交协议(理论性质,没人用),他在2pc提交协议的基础上加了一个前置检查阶段,通过校验判断业务逻辑是否合法合规,由此提高3pc提交协议中执行业务逻辑处理落表时的成功概率

我们上面提到了阿里的分布式事务框架seata,其中他对2pc提交协议的优化具体原理是在一阶段执行业务逻辑时,通过解析SQL进行undolog日志储存,当二阶段需要回滚时,根据BranchId进行逆操作

seata框架中还有另一种模式,就是TCC模式(Try Confirm Cancel)这个模式的原理是将原本一阶段提交的业务逻辑分为两阶段提交,假设我们需要A转账给B 10元原逻辑为A - 10 ,B + 10,这个业务逻辑分为两个阶段,第一个阶段(Try)为A余额-10,冻结金额+10;B冻结金额+10,第一阶段的处理一般为修改处理中状态,或冻结库存、金额等操作。如果此时Try操作成功,则二阶段(Confirm)进行A冻结金额-10;B余额+10,冻结金额-10如果一阶段Try操作失败则进行逆操作(Cancel)

在TCC模式中我们要注意

1.当Try时失败或异常,会直接调用Cancel进行回滚逆处理

2.当多个服务的Confirm有某个服务失败了,那么所有服务的Confirm都会进行重试(要注意服务中Confirm业务逻辑的幂等性多次调用时不该累加修改)

3.某个服务的Cancel失败了,那么所有服务的Cancel都会进行重试(要注意服务中Cancel业务逻辑的幂等性多次调用时不该累加修改)

4.当Try失败后,调用Cancel,很可能出现空回滚的情况(没有收到Try请求,但进行了Cancel),应当允许发生

5.防止悬挂,当Try请求超时后,进行了Cancel空回滚情况,在处理之后收到了超时的Try请求,此时我们应该直接拒绝,因为对于单次分布式事务来说一次请求已经结束了,此时的Try请求没有意义

到这里分布式事务的知识就差不多了,分布式事务主要强调的是数据的实时性,当用户调用接口时,我们需要立刻处理并将结果返回的时候需要用到此方法如果实时性要求不高,我们就可以通过消息队列的方式进行处理,先对请求进行校验保存,确认数据无误后落表,等待服务器依次处理,保证处理结果的最终一致性

希望对小伙伴们有所帮助。

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

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

相关文章

Linux编译器-gcc/g++(动静态链接)

目录 一、Linux编译器-gcc/g的使用1.1 背景知识1.2 预处理,编译,汇编,链接1.3 动静态链接 二、补充sudo设置 一、Linux编译器-gcc/g的使用 1.1 背景知识 我们为什么能在windows或者linux下进行C/C或者其它形式的开发呢?前提条件…

我在VScode学Java(Java一维数组、二维数组、JVM中的堆和栈)重制版

​ 我的个人博客主页:如果’真能转义1️⃣说1️⃣的博客主页 关于Java基本语法学习---->可以参考我的这篇博客:《我在VScode学Java》 Java一维数组、二维数组 零._.在Java中_什么是数组Java 数组是一种数据结构,存储一组相同类型的数据。引…

Docker网络模型(七)使用 IPvlan 网络

使用 IPvlan 网络 IPvlan 驱动为用户提供了全面控制 IPv4 和 IPv6 寻址的能力。 IPvlan 让操作者能完全操控二层(数据链路层)网络的 vlan 标签,甚至也提供了三层(网络传输层)路由控制给感兴趣的用户。对于抽象出物理限…

【SpringSecurity】CSRF、环境配置、授权、认证功能、记住我功能实现

SpringSecurity 文章目录 SpringSecurityCSRF跨站请求伪造攻击开发环境搭建认证直接认证使用数据库认证自定义登录界面 授权基于角色的授权基于权限的授权使用注解判断权限 记住我SecurityContext SpringSecurity是一个基于Spring开发的非常强大的权限验证框架,其核…

Java快速安装以及入门指南

安装 Java 环境教程 Java 是一种广泛应用于软件开发、Web 应用程序和移动应用程序等领域的编程语言。如果您要使用 Java 进行开发或运行需要 Java 程序,您需要先在计算机上安装 Java 环境。 本教程将向您介绍如何在 Windows 操作系统上安装和验证 Java 环境。还将…

第2章 可行性研究

文章目录 第2章 可行性研究2.1 可行性研究的任务2.2 可行性研究过程2.3 系统流程图2.3.1符号2.3.3 分层 2.4 数据流图2.4.1 符号1. 数据源点或终点2. 数据加工(变换数据的处理)3. 数据存储4.数据流数据流与数据加工之间的关系 2.4.2绘制数据流图的例子顶…

chatgpt赋能python:Python3.6.5到Python3.7.5:升级指南

Python 3.6.5到Python 3.7.5:升级指南 Python是一种广泛使用的编程语言,拥有强大的库和框架,能够开发各种类型的应用程序。在Python的发行版中,版本更新是常见的过程,以提供更好的性能和新的功能。 本文将介绍如何将…

手记系列之六 ----- 分享个人使用kafka经验

前言 本篇文章主要介绍的关于本人从刚工作到现在使用kafka的经验,内容非常多,包含了kafka的常用命令,在生产环境中遇到的一些场景处理,kafka的一些web工具推荐等等。由于kafka这块的记录以及经验是从我刚开始使用kafka&#xff0…

chatgpt赋能python:Python怎么一行一行读文本?

Python怎么一行一行读文本? 在Python中,要一行一行地读取文本文件,我们可以使用Python内置函数readline()。它每次读取一行文本,并且会自动把文本的换行符\n去掉。下面我们来详细了解如何使用readline()函数读取文本文件。 读取…

4.卡尔曼滤波原理及实战

欢迎访问个人网络日志🌹🌹知行空间🌹🌹 文章目录 0.关于卡尔曼1.卡尔曼滤波算法2.卡尔曼滤波算法的应用一个简单例子一个复杂的例子参考 0.关于卡尔曼 卡尔曼,匈牙利数学家,1930年出生于匈牙利首都布达佩斯…

chatgpt赋能python:Python数据分析:Vlookup函数在Python中的实现

Python数据分析:Vlookup函数在Python中的实现 简介 Vlookup是一种常见的数据分析函数,用于在两个数据表/数据集中查找并关联相应的数据。这个函数是在Excel中非常常见的,但是当我们进行大型数据分析时,我们可以使用Python来实现…

2023.6.8小记——嵌入式系统初识、什么是ARM架构?

今天还挺充实的,早上在图书馆本来想学一下notion,结果看李沐老师的动手深度学习看到十点半,在电脑上配置了李沐老师的d2l和jupyter,等后续有时间的时候再继续学。 下午看了一下notion的使用方法,这玩意初学者用起来是…

chatgpt赋能python:Python如何一行输出五个星号

Python如何一行输出五个星号 Python是一种流行的编程语言,它被广泛用于各种领域,包括Web开发,数据科学和机器学习。在这篇文章中,我们将探讨如何使用Python在一行中输出五个星号。 输出五个星号的方法 Python提供了几种方法来在…

牛客网语法刷题(C语言) — 输出格式化

🤩本文作者:大家好,我是paperjie,感谢你阅读本文,欢迎一建三连哦。 🥰内容专栏:这里是《C语言—语法篇》专栏,笔者用重金(时间和精力)打造,基础知识一网打尽,…

从字符串中读写的方法:c语言中的sscanf、sprintf函数,c++中的I/O流strstream、stringstream

一、sscanf、sprintf函数 众所周知,c语言中我们常使用的标准输入输出流函数为scanf()、printf(),默认从键盘上输入数据、向屏幕输出数据。此外,c语言中还提供了另一组库函数sscanf()、sprintf()函数,它们的功能与前者相同&#x…

spark复习重点

什么是大数据 大数据是指数据量巨大、类型繁多、处理速度快的数据集合。它不仅包括传统的结构化数据,还包括非结构化数据、半结构化数据等多种形式的数据。大数据的处理需要使用特殊的技术和工具,如分布式存储、分布式计算、数据挖掘、机器学习等。 大…

软考A计划-系统架构师-官方考试指定教程-(7/15)

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资源分享&am…

uniapp主题切换功能的第二种实现方式(scss变量+require)

在上一篇 “uniapp主题切换功能的第一种实现方式(scss变量vuex)” 中介绍了第一种如何切换主题,但我们总结出一些不好的地方,例如扩展性不强,维护起来也困难等等,那么接下我再给大家介绍另外一种切换主题的…

聊聊那些奇葩的代码规范 —— 滥用静态导入

因为有些要求感觉实是太过奇葩,收集下来娱乐下大家。 代码规范要求 要求如果代码可以静态导入的话,就必须要静态导入。 所有的代码如果不静态导入,就直接 PR 拒绝合并。 举例:equalsAnyIgnoreCase("test","tes…

总结894

学习目标: 月目标:6月(线性代数强化9讲遍,背诵15篇短文,考研核心词过三遍) 周目标:线性代数强化3讲,英语背3篇文章并回诵,检测 每日必复习(5分钟&#xff0…