分布式事务

事务是用户定义的一系列的数据库操作,这些操作可以视为一个完整的逻辑处理工作单元,要么全部成功(全部执行),要么全部失败(全都不执行),是不可分割的工作单元

分布式事务是指会涉及到操作多个数据库(服务)的事务

其实就是将对同一数据库(服务)事务的概念扩大到了对多个数据库(服务)的事务。

目的是为了保证分布式系统中的数据一致性。

事务的特性ACID:

A 原子性

C 一致性:通过锁实现

I 隔离性

D 持久性

分布式事务场景

 

 

分布式事务处理的关键是必须有一种方法可以知道事务在任何地方的所有动作,提交或回滚事务的决定必须产生统一的结果(全部提交或者全部回滚)

引入协调者

 XA规范

AP应用管理器:Web服务器

TM事务管理者(协调者)

RM 简单可以理解为数据库

XA规范: 定义了事务协调者和数据库之间的接口规范(接口函数),事务协调者用它来通知数据库事务的开始、结束以及提交、回滚等。

XA接口函数由数据库厂商提供

二阶段提交协议(2PC)和三阶段提交协议(3PC)(实际不会用)就是根据这一思想衍生出来的,保证了分布式事务的原子性:所有节点要么全做,要么全不做。

2PC生活中的例子

乐观的(SQL全部执行成功):

第一阶段:

牧师:你愿意娶这个女人吗?爱她、忠诚于她,无论她贫穷、疾病或者残疾,直到死亡,你愿意吗?

男:yes, I do

牧师:你愿意嫁给这个男人吗?爱他、忠诚于他,无论他贫穷、疾病或者残疾,直到死亡,你愿意吗?

女:我愿意

第二阶段

牧师:既然如此,请你们面向对方,握住对方的双手,作为妻子和丈夫向对方宣告誓言

男:我西门*,全心全意娶潘**作为我的妻子,无论....作为平等的忠实伴侣,度过今后的一生。

女:我潘**,全心全意嫁给西门*为妻,无论....作为平等的忠实伴侣,度过今后的一生。

皆大欢喜

悲观的(某个SQL报错):

第一阶段:

牧师:你愿意娶这个女人吗?爱她、忠诚于她,无论她贫穷、疾病或者残疾,直到死亡,你愿意吗?

男:yes, I do

牧师:你愿意嫁给这个男人吗?爱他、忠诚于他,无论他贫穷、疾病或者残疾,直到死亡,你愿意吗?

女:我不愿意

第二阶段

牧师:既然如此,请你们各自回家好好考虑考虑吧,亲友们也都散了吧

男:好的。

女:好的。

亲友不欢而散

2PC的设计

 第一阶段(准备阶段)

各数据库执行SQL,执行完之后给协调者一个反馈(成功或者失败),等待协调者发第二次指令(第二阶段执行之前保留数据库连接资源,第二阶段执行完成之后释放)。

协调者发第二次指令:第一阶段所有参与者给的反馈都是成功(同意),协调者会发出提交的指令。

如果一个参与者有一个返回的是失败或者超过指定时间没有收到反馈,则协调者发出回滚的指令。

第二阶段(提交或者回滚阶段)

如果协调者发出的第二次指令是提交,数据库进行提交落库、释放资源(占有的数据库连接资源)。

如果协调者发出的第二次指令是回滚,则数据进行回滚并释放资源,这是一个靠谱的选择,1.如果第一阶段某个参与者给出了失败的反馈,那毫无疑问需要回滚。2.如果指定时间内没有收到反馈,那他可能成功也可能失败,回滚是一个比较靠谱的选择。

2PC协议的缺点:

1.单点故障:协调者如果挂了,则事务会失败无法保证,解决方案是搭建协调者集群。

2.阻塞资源:占用数据库连接、性能低,第一阶段执行完成后到协调者发第二条指令之前,占有数据库的资源,不能提交或者回滚,数据库的资源是宝贵的,这样会导致性能低。

 解决方案:第一阶段直接提交并记录提交之前的数据库状态(释放资源),如果协调者发送的第二条指令是提交,删除记录的状态即可。如果协调者发出的第二条指令是回滚,回滚到我们记录的回滚之前的状态即可。这也是Seata中对于2PC的优化

3.数据不一致:第二阶段出错,数据不一致

假设第一阶段大家返回的都是成功,但是当协调者发出第二条指令(提交)的时候,某个数据库的网络断了(收不到第二次指令),则其他数据库都执行了提交的操作,但是这个断了连接的数据库没有执行,导致数据不一致。

发生网络连接故障的数据库的状态预期应该从1变成2,但是因为故障导致没有接受到协调者的提交指令,现在状态还是1.

其他某个数据库的预期状态从A变成B,因为一切正常,提交了,现在的状态是B。

解决方案:用脚本检查异常,如果出现了异常,则要么前滚(把故障库从1变成2),要么回滚(把正常库从B回滚成A)

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

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

相关文章

[NOIP2007 普及组] 纪念品分组

[NOIP2007 普及组] 纪念品分组 题目描述 元旦快到了,校学生会让乐乐负责新年晚会的纪念品发放工作。为使得参加晚会的同学所获得 的纪念品价值相对均衡,他要把购来的纪念品根据价格进行分组,但每组最多只能包括两件纪念品, 并且…

17、YML配置文件及让springboot启动时加载我们自定义的yml配置文件的几种方式

YML配置文件及加载自定义配置文件的几种方式 ★ YAML配置文件 其实本质和.properties文件的是一样的。 Spring Boot默认使用SnakeYml工具来处理YAML配置文件,SnakeYml工具默认就会被spring-boot-starter导入,因此无需开发者做任何额外配置。 YAML本质…

ip网络广播系统网络音频解码终端公共广播SV-7101

SV-7101V网络音频终端产品简介 网络广播终端SV-7101V,接收网络音频流,实时解码播放。本设备只有网络广播功能,是一款简单的网络广播终端。提供一路线路输出接功放或有源音箱。 产品特点 ■ 提供固件网络远程升级■ 标准RJ45网络接口&…

安装Win10操作系统时找不到任何驱动器的解决方法

安装Win10操作系统时找不到任何驱动器的解决方法 有时候在一台新电脑上使用U盘安装系统时提示:我们找不到任何驱动器。 如下图所示: 解决方法: 一、按F12(不同电脑进入Bios的按键可能不同)将电脑进入Bios画面&#x…

MySQL 的事件调度器

MySQL 的事件调度器可以通过以下方式进行管理: 1】查看事件调度器的状态 SHOW VARIABLES LIKE event_scheduler;2】启用/禁用事件调度器 SET GLOBAL event_scheduler ON;SET GLOBAL event_scheduler OFF; 注意:启用/禁用事件调度器需要具有 SUPE…

处理nacos、tomcat、nginx日志增长过快问题

1.nacos日志清理 修改nacos-logback.xml 将日志级别改为error级&#xff0c;减少info级日志产生量 将<maxHistory>调整为2以下&#xff0c;将 <totalSizeCap>调整为2GB左右 比如&#xff1a; [rootiZ0jlapur4hqjezy8waee0Z logs]# ll -h total 2.1G -rw-r--r-…

【Spring Boot】Thymeleaf模板引擎 — 表达式的语法

表达式的语法 模板的主要作用是将后台返回的数据渲染到HTML中。那么Thymeleaf是如何解析后台数据的呢&#xff1f;接下来从变量、方法、条件判断、循环、运算&#xff08;逻辑运算、布尔运算、比较运算、条件运算&#xff09;方面学习Thymeleaf表达式支持的语法。 1.赋值和拼…

RPC框架引入zookeeper服务注册与服务发现

Zookeeper概念及其作用 ZooKeeper是一个分布式的&#xff0c;开放源码的分布式应用程序协调服务&#xff0c;是Google的Chubby一个开源的实现&#xff0c;是大数据生态中的重要组件。它是集群的管理者&#xff0c;监视着集群中各个节点的状态根据节点提交的反馈进行下一步合理…

使用 LangChain 搭建基于 Amazon DynamoDB 的大语言模型应用

LangChain 是一个旨在简化使用大型语言模型创建应用程序的框架。作为语言模型集成框架&#xff0c;在这个应用场景中&#xff0c;LangChain 将与 Amazon DynamoDB 紧密结合&#xff0c;构建一个完整的基于大语言模型的聊天应用。 本次活动&#xff0c;我们特意邀请了亚马逊云科…

git 版本管理工具 学习笔记

git 学习笔记 目录 一、git是什么 二、创建仓库 三、工作区域和文件状态 四、添加和提交文件 五、回退版本 &#xff08;了解&#xff09; 六、查看差异 七、删除文件 八、.gitignore文件&#xff08;了解&#xff09; 九、github ssh-key配置 十、本地仓库和远程仓库内…

C++ STL vector

目录 一.认识vector 二.vector的使用 1.vector的构造函数 2.vector的迭代器 2.1 begin&#xff08;&#xff09;&#xff0c;end&#xff08;&#xff09; 2.2 rbegin&#xff08;&#xff09;&#xff0c;rend&#xff08;&#xff09; 2.3 迭代器初始化对象 3. vector…

pp-ocr报错记录

RESER 报错&#xff1a; distutils.errors.DistutilsError: Could not find suitable distribution for Requirement.parse(‘tomli>1.0.0’) 解决办法&#xff1a; 参考&#xff1a;https://stackoverflow.com/questions/67603407/distutilserror-could-not-find-suitable…

网络编程——MAC地址、IP地址和子网掩码

MAC地址、IP地址和子网掩码 一、MAC地址&#xff1a;硬件身份证 1、MAC地址的概念 MAC地址&#xff0c;即媒体访问控制地址&#xff08;Media Access Control Address&#xff09;&#xff0c;是一个用于唯一标识网络设备的物理地址。每个网络接口卡&#xff08;NIC&#xf…

RocketMQ 主备自动切换模式部署

目录 主备自动切换模式部署 Controller 部署​ Controller 嵌入 NameServer 部署​ Controller 独立部署​ Broker 部署​ 兼容性​ 升级注意事项​ 主备自动切换模式部署 该文档主要介绍如何部署支持自动主从切换的 RocketMQ 集群&#xff0c;其架构如上图所示&#xff…

TeeChart NET for MAUI Crack

TeeChart NET for MAUI Crack 跨平台图表-移动或桌面应用程序的核心图表代码相同。 图表集合-60多种图表类型和50多种财务和统计指标。 图表类型 60多种2D和3D图表类型以及多种组合&#xff0c;包括&#xff1a; 标准&#xff1a;线条(条形)、条形、区域、饼图、快线、点(散点…

24届近5年上海大学自动化考研院校分析

今天给大家带来的是上海大学控制考研分析 满满干货&#xff5e;还不快快点赞收藏 一、上海大学 学校简介 上海大学是上海市属的综合性研究型大学&#xff0c;是教育部与上海市人民政府共建高校&#xff0c;是国家“211 工程”重点建设高校、上海市高水平地方大学建设高校&a…

Python爬虫遇到重定向问题解决办法汇总

在进行Python爬虫任务时&#xff0c;遇到重定向问题是常见的问题之一。重定向是指在发送请求时&#xff0c;服务器会返回一个新的URL&#xff0c;将请求重新定向到该URL。为了帮助您解决这个问题&#xff0c;本文将提供一些实用的解决办法&#xff0c;并给出相关的代码示例&…

论文阅读 - Social bot detection in the age of ChatGPT: Challenges and opportunities

论文链接&#xff1a;https://www.researchgate.net/publication/371661341_Social_bot_detection_in_the_age_of_ChatGPT_Challenges_and_opportunities 目录 摘要&#xff1a; 引言 1.1. Background on social bots and their role in society 1.2. The rise of AI-gene…

Java私有仓库Nexus搭建部署

Java私有仓库Nexus搭建部署 需求分析 为什么要搭建部署Nexus私有仓库&#xff0c;有什么用&#xff0c;用来干什么&#xff0c;怎么用&#xff0c;也许是大家看到这篇文章的第一个反应和疑惑&#xff0c;这里给大家先笼统的做一个介绍&#xff1a; 依赖管理&#xff1a;在Java…

css, resize 拖拉宽度

效果如下&#xff1a; 可直接复制预览查看属性值: 关键样式属性&#xff1a; resize: horizontal; overflow-x: auto; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content…