分布式事务-概念-实现方式

news2024/11/22 16:21:33

分布式事务

文章目录

  • 分布式事务
  • 一、分布式事务相关概念
    • 1.分布式事务架构图
    • 2.理解本地事务相关概念
    • 3.理解分布式事务相关概念
      • 1.CAP理论
      • 2.刚性事务(CP)与柔性事务(AP)
      • 3.基于AP模型衍生下的BASE理论
    • 4 .如何从大方向选择分布式事务?
    • 5 .分布式事务DTP模型:3大角色
    • 6.XA规范协议:
  • 二、分布式事务实现方案及原理
    • 1.2pc提交协议(刚性事务,强一致性)
    • 2.3PC三阶段提交
    • 3.AT事务(基于2pc做了补偿)自动事务
    • 4.TCC(try confirm cancel)
    • 5.saga
      • 5.1 基于事件:
      • 5.1 基于命令:
    • 6.rocketmq实现分布式事务
    • 7.最大努力通知


一、分布式事务相关概念

1.分布式事务架构图

分布式事务架构图

2.理解本地事务相关概念

1 本地事务4大特性:AICD(原子性、隔离性、一致性、持久性)
2 隔离级别:读未提交、读已提交、可重复读、序列化
3 不同隔离级别出现的问题:脏读、幻读等
4 事务的7大传播行为:略

3.理解分布式事务相关概念

1.CAP理论

核心理念

C:一致性
A:可用性
P:分区容错性

在分布式场景中只存在两种情况:AP、CP
选用分布式解决方案时,根据业务需求对AP或CP进行选择

2.刚性事务(CP)与柔性事务(AP)

刚性事务:也称强一致性,比如ACID理论
实现方案:Seata XA/AT、3PC、LCN等

柔性事务:基本可用、最终一致性,如BASE理论
实现方案:通知型(MQ事务消息、本地消息表方案)与补偿型(TCC、SAGA)

柔性事务:业务场景,抢购(扣库存、生成订单、发物流),支付回调等
刚性事务:业务场景,特定一些结算或金融业务要求强一致性的场景

3.基于AP模型衍生下的BASE理论

核心理念:

1.基本可用
2.软状态
3.最终一致性

4 .如何从大方向选择分布式事务?

业务规避 > BASE柔性事务 > CP刚性事务

如果 能用业务规避避免分布式事务,那最好了。
其次 先用BASE柔性事物
最后 考虑用CP刚性事务

5 .分布式事务DTP模型:3大角色

AP:应用程序。如订单服务、库存服务
RM:资源管理器。如mysql或redis等;必须实现XA定义的接口
TM:事务管理器。负责分配事务唯一标识,监控事务执行进度并负责事务提交或回滚

6.XA规范协议:

XA规范了TM(事务管理器)与RM(资源管理器)之间的通信接口,是TM与RM通讯的桥梁

二、分布式事务实现方案及原理

1.2pc提交协议(刚性事务,强一致性)

在这里插入图片描述

2pc两阶段提交协议基本过程:
1.准备阶段:(投票阶段)检查库存是否足够
2.提交阶段 :根据参与者的准备阶段返回值进行判断是回滚还是提交事务

角色:
事务协调器+事务参与者

优缺点:

优点:
1.各事务参与者的事务由数据库自身实现,业务侵入少
缺点:
1.同步阻塞,需要等待其中参与者执行最长的事务时间,并发能力下降
2.事务管理器故障,导致整个分布式事务无法使用
3.网络问题可能导致事务协调器没有通知到所有事务参与者
4.占用比较高的资源

通信故障解决:

2pc事务协调者通信故障如何解决
1.协调者设定超时时间,超过时间默认参与者执行失败
2.协调者心跳机制,定期判断参与者是否存活
3.预备提交,参与者发送消息到协调者,如果协调者没有收到消息,默认失败通知参与者回滚
4.备份协调者,监控协调者状态
5.消息队列,参与者将消息写到mq,事务协调者去mq获取事务日志

2.3PC三阶段提交

优化2PC:同步阻塞和单点故障问题

在这里插入图片描述

1.conCommit阶段:协调者通知每个参与者是否可以提交,都返回yes进入下一个阶段
2.preCommit阶段(预提交):执行事务不提交,都成功则进入下一个阶段(写binlog);协调者和参与者都引入了超时机制
3.doCommit阶段:提交或回滚阶段;此阶段失败会执行undolog;如果是网络问题超时参与者没有收到协调者的提交信息,也会被默认提交;

3.AT事务(基于2pc做了补偿)自动事务

工作流程:

在这里插入图片描述
第一阶段:此阶段生成before 快照->执行sql(写undolog relaylog)->after 快照->对数据行加行锁
在这里插入图片描述
第二阶段:成功
在这里插入图片描述
第二阶段:失败
在这里插入图片描述
优点:业务代码无入侵
缺点:
第二阶段事务失败可能会有脏数据,需要记录下来人为干预

4.TCC(try confirm cancel)

不会像2PC和3PC阻塞资源,引入补偿机制,把资源转换成业务逻辑形式提高系统性能

在这里插入图片描述
try阶段:对资源检测及锁定
comfirm阶段:执行真正的业务;失败后会进行重试;需要考虑幂等性
cancel:失败进行业务回滚;需要考虑幂等性

try阶段
锁定资源:设置预备状态或冻结某一部分资源;如冻结库存,预增积分等

在这里插入图片描述
comfirm阶段:
提交:冻结库存清零,实际库存更改;预加积分进行实际累加
在这里插入图片描述
cancel阶段:
预备阶段的数据进行恢复:如冻结减库存进行回退;预增积分进行清零等
在这里插入图片描述
优点:性能高
缺点:实现复杂;每个步骤都需要代码实现

5.saga

思想:复杂的事务拆分成多个小事务

流程:
在这里插入图片描述
T1完成事务后会以事件方式通知下一个事务T2

实现方式:1.基于事件 2,基于命令的方式

5.1 基于事件:

在这里插入图片描述
回滚:某个服务失败,会生成一个回滚事件,其他执行完事务的服务监听并且进行补偿(程序员写代码)回滚;

优缺点:

优点:简单容易理解;各参与方无直接沟通,完全解耦。没有事务协调器;比较适合只有2-4个服务参与的分布式事务场景
缺点: 参与者较多时,容易比较失控。各个参与方可以随意监听对方的消息,以至于最后没人知道到底有哪些系统监听哪些消息。更严重的是,可能产生环形监听,如两个服务相互监听对方产生的事件;

基于命令的方式就出现了

5.1 基于命令:

特点:1 .定义一个协调器服务,2.不需要事件监听
在这里插入图片描述

6.rocketmq实现分布式事务

基于rocketmq的事务消息

在这里插入图片描述

7.最大努力通知

适用于外部系统,敏感度低的场景;
1.A向银行B发起扣钱请求
2.B扣钱
3.B扣钱成功后通知A扣钱成功

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

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

相关文章

MySQL正则表达式 | 事务详解

目录 一、正则表达式 实例操作 二、事务 事务控制语句 MYSQL 事务处理主要有两种方法 SQL测试代码 PHP中使用事务实例 使用保留点 SAVEPOINT 一、正则表达式 MySQL可以通过 LIKE ...% 来进行模糊匹配。 MySQL 同样也支持其他正则表达式的匹配, MySQL中使用…

【嵌入式Linux内核驱动】GPIO子系统

GPIO子系统 总体框架 通用功能 可以设为输出:让它输出高低电平;可以设为输入,读取引脚当前电平;可以用来触发中断 通用属性 Active-High and Active-LowOpen Drain and Open Source 开漏和开源 GPIOLIB向上提供的gpiod相关接…

数据结构与算法之手撕排序算法

前言 为什么要学习排序算法? 根据统计,早起大型机CPU资源的四分之一都花在了数据排序上面。排序算法作为最基础的算法,各种操作系统、编程语言都提供了内置的实现。既然排序实现随处可见,我们为什么还要自己动手实现呢&#xff1…

文章伪原创-文章伪原创工具

伪原创原理 文章伪原创的原理是将一篇原始文章进行修改、改写、调整或者替换一些词句等方式,生成与原始文章类似但又不完全相同的新文章。 文章伪原创的实现需要用到自然语言处理技术和相关的算法。具体的过程包括以下几个步骤: 分析原始文章&#xff…

YML是一种数据存储格式

读取yml配置信息 Value("${province}") private String province; Value("${user.sname}") private String name1; Value("${user1[1].name}") private String name; Value("${server.port}") private int port; server:port: 8099 #…

大数据现在找工作难么

大数据行业工作好找还是难找不是光靠嘴说出来的结合实际,看看市场上的招聘需求和岗位要求就大致知道了 要想符合企业用人规范,学历,工作经验,掌握技能都是非常重要的~ 先来看几个招聘网站的报告数据: Boss直聘发布的…

Linux应用编程(系统信息与系统资源)

在应用程序当中,有时往往需要去获取到一些系统相关的信息,譬如时间、日期、以及其它一些系统相关信息,本章将向大家介绍如何通过 Linux 系统调用或 C 库函数获取系统信息,譬如获取系统时间、日期以及设置系统时间、日期等&#xf…

java拦截器怎么实现

Java拦截器是一种对象拦截器,它可以拦截任何的类、方法和字段。拦截器还可以用于检查类是否已经加载以及对字段的访问权限是否符合规范。下面就让我们来了解一下 java拦截器怎么实现吧。 在 Java中,可以通过重写方法和代码块来实现拦截功能,但…

通俗讲解什么是Socket通讯

Socket通讯原理 1、什么是Socket? Socket,即套接字。就是两台主机之间逻辑连接的端点。(通俗来说:网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket)。 Socket是一套…

【python】类和对象 | 一些混淆的知识点再复盘 | 魔术方法(特殊方法)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、魔术方法二、构造方法三、__ getitem __方法四、__ len __方法前言 参考视频:视频 一、魔术方法 首先看一看chatgpt对魔术方法(特…

一图看懂 xlsxwriter 模块:用于创建 Excel .xlsx 文件, 资料整理+笔记(大全)

本文由 大侠(AhcaoZhu)原创,转载请声明。 链接: https://blog.csdn.net/Ahcao2008 一图看懂 xlsxwriter 模块:用于创建 Excel .xlsx 文件, 资料整理笔记(大全)摘要模块图类关系图模块全展开【xlsxwriter】统计常量模块1 xlsxwrite…

数据爬虫爬数据时常遇到的问题

第一,可能不能直接通过pyppeteer简单的直接page.querySelectorAll()获取所有元素然后直接 str(await (await element_songer_name.getProperty("title")).jsonValue()) 得到数据值,主要原因可能是#document问题, 所以遇到这个问题…

vue项目配置不同环境打包指令(vue-cli2、vue-cli3项目)

目录 一、vue-cli3项目:1、项目根目录创建环境文件2、 配置打包指令3、打包生成不同的dist文件夹 二、vue-cli2项目1、配置指令2.创建环境文件3、config/index.js中添加 三、遇到的问题1.vue-cli3项目配置打包指令,没有生成css文件--mode test2、vue-cli…

UE DTMqtt 虚幻引擎 Mqtt 客户端插件说明

目录 CreateMqttClient Connect Subscribe UnSubscribe Publish Disconnect BindConnectedDelegate BindConnectionLostDelegate BindMessageDelegate CreateMqttClient 创建一个Mqtt客户端对象 Connect 链接Mqtt服务器Subscribe 订阅消息频道UnSubscribe 取消订阅频道…

【go项目-geecache】动手写分布式缓存 - day3 - HTTP 服务端

收获总结: 了解go函数的可变参数的使用,还有切片展开的方式即…了解了HTTP通信方式,hinder的使用了解了go.mod ,import 和modoule的使用 分布式缓存需要实现点对点的通信,我们可以使用HTTP来实现节点之间的通信&…

Linux·IO子系统和文件系统读写流程

目录 1.概述 2.linux IO子系统和文件系统读写流程 3.IO之流程与buffer概览 4.IO队列和IO调度 1.概述 分析一下写操作: char *buf malloc(MAX_BUF_SIZE); strncpy(buf, src, , MAX_BUF_SIZE); fwrite(buf, MAX_BUF_SIZE, 1, fp); fclose(fp); 以下图为例&…

九耶丨钛伦特-用深度学习实现垃圾图像分类(二)

3 构建模型 这里大家可以使用自己在项目 2 中寻找到的最好的模型结构,做为示例,这里以实验2-3 中的 snet 模型为基础,并进行细微的调整。 样例代码: 需要注意的是,我们在第一层卷基层之后增加了一层池化层,主要是为了降…

大数据技术之Spark

第1章 Spark概述 1.1 什么是Spark 回顾:Hadoop主要解决,海量数据的存储和海量数据的分析计算。 Spark是一种基于内存的快速、通用、可扩展的大数据分析计算引擎。 Hadoop的Yarn框架比Spark框架诞生的晚,所以Spark自己也设计了一套资源调度…

30天学会《Streamlit》(1)

30学会《Streamlit》是一项编码挑战,旨在帮助您开始构建Streamlit应用程序。特别是,您将能够: 为构建Streamlit应用程序设置编码环境 构建您的第一个Streamlit应用程序 了解用于Streamlit应用程序的所有很棒的输入/输出小部件 第1天 - 建立…

Java面向对象高级【注解和反射】

目录 注解 什么是注解? 自定义注解 元注解 反射 什么是反射 静态语言和动态语言 动态语言 静态语言 对比 Class类 Java内存分析 类加载过程 类加载器 获取运行时类的完整结构 通过Class对象实例化对象 1.调用Class对象的newInstance 2.Constructor…