分布式事务解决方案

news/2024/9/12 21:28:51/文章来源:https://www.cnblogs.com/xyuanzi/p/18372746

背景

分布式事务,后端开发中比较常见啦。因为在面试的时候,总是有interviewers让我给他普及一下分布式事务,虽然我会的也不多呀但是还是浅浅说一说;
今天心血来潮,好好地总结一下分布式事务,希望每一位后端工程师都能彻底理解分布式事务。

什么是分布式事务?

答:既然是分布式,首先必然是分布式系统中的一个概念啦。单体应用没这个东西,也不需要这个东西。本地事务就够啦,Spring给我们提供的注解@Transactional, InnoDB引擎会为我们保证事务的ACID特性。但是分布式系统中,目前大多数互联网公司都在用分布式系统,微服务架构等。所以,学好分布式事务太有必要。废话不多说,直接上原理。
总结来说,分布式事务涉及了多个独立的数据源(数据库)或者参与者的事务操作,这些数据源分布在不同的计算机或网络中;分布式事务确保在不同节点之间的多个操作要么全部成功,要么全部失败。

分布式事务解决方案

2PC

两阶段提交协议,也叫XA协议。主要包含两个阶段,第一个阶段是预备阶段,第二个阶段是提交阶段。
2PC协议首先有分事务协调者角色和事务参与者。协调者是事先指定好的一个节点。参与者是一些涉及到数据库操作的表,暂时可以这样理解。这些多个参与者一般是分布在不同的节点上。

  • 准备阶段。协调者向所有参与者发送事务准备请求,参与者执事务操作,并回复协调者准备就绪的消息;如果多个参与者中有一个参与者未准备就绪或者发生错误,那么协调者会发送中止请求。只有所有参与者都回复准备就绪,才会进入第二阶段。
  • 提交阶段。所有参与者都已经准备就绪,协调者分别发送提交的消息,参与者收到消息以后,执行事务的提交操作,并向协调者回复提交完成。
    协调者收到了所有事务参与者提交完成的消息后,整个分布式事务才算提交完成。如果有一个参与者未能提交或者发生错误,那么协调者会向所有参与者发送中止请求,进行事务的回滚操作。
如何评价2PC?

1、2PC有单点故障的问题。一旦事务协调者故障(因为是使用到了某个节点嘛),那么整个事务将无法继续进行,陷入故障。
2、数据不一致。如果协调者在发送提交信息时,只有部分参与者收到了消息,并执行了提交,此时网络异常,就导致只有部分参与者执行了事物的提交,另一部分则没有提交,从而造成一个数据不一致性。
3、阻塞风险。如果准备阶段,有一个参与者无法响应或者失败,那么整个系统都会陷入阻塞状态,等待超时处理。
4、性能问题。整个链路是串行的,响应时间较长,不适合高并发的场景。

3PC

三阶段提交又称3PC,相对于2PC来说增加了CanCommit阶段和超时机制。如果某段时间内没有收到协调者的commit请求,那么就会自动进行commit,解决了2PC单点故障的问题。
但是性能问题和数据不一致性问题还是没解决。3PC的步骤是这样的:
1、询问节点。CanCommit, 首先询问参与者,是否有能力完成此次事务?

  • 如果都返回yes,则进入第二阶段
  • 有一个返回no或等待响应超时,则中断事务,并向所有参与者发送abort请求。
    2、准备阶段;同2PC。需要注意的是,参与者收到消息后开始执行事务操作,会首先将Undo和Redo信息记录到事务日志中。参与者执行完事务操作后,向协调者反馈ACK, 表示已经准备好提交了。
    3、提交阶段。同2PC。

TCC

本地消息表

本地消息表+MQ最终一致性事务

Seate

Saga

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

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

相关文章

042、Vue3+TypeScript基础,pinia库存储数据修改的两种方式

01、main.ts代码如下:// 引入createApp用于创建Vue实例 import {createApp} from vue // 引入App.vue根组件 import App from ./App.vue//第一步:引入pinia import {createPinia} from piniaconst app = createApp(App);//第二步:创建pinia实例 const pinia = createPinia()…

极客少年旅游回忆录

Day 0 “意外惊喜”原本8:20的飞机直接给我干到8:05起飞,抵达成都天府机场大概在9:35。——哥们太早了,我们在成都租的车还没有及时赶到! 于是,我们等到10:10,驾驶着川 G的车在高速公路上行驶,我特别感慨:大城市的车真的好多!(不怕被超速了哈哈) 待 1h 之后,成功入住…

[vue3] vue3更新组件流程与diff算法

Vue3 中的 patch 函数结合 diff 算法,通过比较新旧 vnode 序列,优化组件更新流程。diff 算法复用旧节点并最小化移动操作,利用最长递增子序列算法提升渲染性能,可以有效减少创建和销毁节点的开销。在Vue3中,组件的更新通过patch函数进行处理。 patch函数源码位置:core/pa…

DDD的函数式编程实现

DDD是一种成熟的软件设计方法,旨在确保领域专家和开发人员能够有效合作,创造出高质量的软件。 本文介绍咋将FP(函数式编程)应用于DDD的实现,使其既优雅又简洁。C4模型中,软件架构图分为四个层次:“系统上下文”、“容器”、“组件”和“代码”。 “组件”是构成容器的基…

使用FModel提取黑神话悟空的资产

介绍使用FModel提取黑神话悟空资产的方法目录前言设置效果展示闲聊可能遇到的问题没有相应的UE引擎版本选项 前言 黑神话悟空昨天上线了,解个包looklook。本文内容比较简洁,仅介绍解包黑神话所需的专项配置,关于FModel的基础使用流程,请见《使用FModel提取UE4/5游戏资产》 …

rust库-ouroboros中文文档

文档原文:https://docs.rs/ouroboros/latest/ouroboros/attr.self_referencing.html 属性宏ouroboros::self_referencing #[self_referencing]此宏用于将常规结构转换为自引用结构。举个例子: use ouroboros::self_referencing;#[self_referencing] struct MyStruct {int_dat…

mini-lsm通关笔记Week1Day4

项目地址:https://github.com/skyzh/mini-lsm 个人实现地址:https://gitee.com/cnyuyang/mini-lsmTask 1-SST Builder在此任务中,您需要修改: src/table/builder.rs src/table.rs SST由存储在磁盘上的数据块和索引块组成。通常,数据块都是懒加载的-直到用户发出请求,它们…

高效流程办公,相信自定义流程表单开发

对于自定义流程表单开发的优势特点,可以在本文中获得详细答案。如果要将企业内部的数据做好高效管理,需要借助更优质的软件平台。低代码技术平台够灵活、更高效、易维护、可视化操作等,可以满足日益扩大的业务需求,助力企业做好数据资源管理,共同为实现流程化办公和数字化…

041、Vue3+TypeScript基础,使用pinia库来储存数据

01、输入npm install pinia 02、main.js代码如下:// 引入createApp用于创建Vue实例 import {createApp} from vue // 引入App.vue根组件 import App from ./App.vue//第一步:引入pinia import {createPinia} from piniaconst app = createApp(App);//第二步:创建pinia实例 c…

三维几何生成:多段线、圆弧

一、三维空间多段线几何 1 应用背景 ​​  opengl常用glLineWidth命令设置线宽,此线宽在透视投影中不会随着相机远近变化而缩放。项目中高版本glLineWidth命令失效,需要考虑如何快速、方便、宽度不变的多段线几何。方案a:纯shader绘制曲线,绘制到一个二维平面上,然后将平…

本地快速安装运行史上最强开源LLaMa3大模型

https://liaoxuefeng.com/blogs/all/2024-05-06-llama3/史上最强开源AI大模型——Meta的LLaMa3一经发布,各项指标全面逼近GPT-4。它提供了8B和70B两个版本,8B版本最低仅需4G显存即可运行,可以说是迄今为止能在本地运行的最强LLM。 虽然LLaMa3对中文支持不算好,但HuggingFac…

第二章 redis环境安装与配置

redis环境安装 redis的官方只提供了linux版本的redis,window系统的redis是微软团队根据官方的linux版本高仿的。 官方原版: https://redis.io/ 中文官网:http://www.redis.cn 1、下载和安装 下载地址:https://github.com/tporadowski/redis/releases使用以下命令启动redis服务…