分布式事务

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

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

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

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

事务的特性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.mzph.cn/news/23294.shtml

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

相关文章

谷粒商城第九天-解决商品品牌问题以及前后端使用检验框架检验参数

目录 一、总述 二、商品分类问题 三、前端检验 四、后端检验 五、总结 一、总述 在完成完商品分类的时候,后来测试的时候还是发现了一些问题,现在将其进行解决,问题如下: 1. 取消显示的时候,如果取消了显示&…

Mybatis引出的一系列问题-spring多数据源配置

在日常开发中我们都是以单个数据库进行开发,在小型项目中是完全能够满足需求的。但是,当我们牵扯到像淘宝、京东这样的大型项目的时候,单个数据库就难以承受用户的CRUD操作。那么此时,我们就需要使用多个数据源进行读写分离的操作…

Qt中ffmpeg API存储和显示摄像头视频

Qt中ffmpeg API存储和显示摄像头视频的功能需要之前写的视频ffmpegAPI的视频播放的流程。 代码源码位置:https://download.csdn.net/download/qq_43812868/88157743?spm1001.2014.3001.5503 一、存储和显示摄像头的视频的流程 这是读取打开视频文件的流程&#x…

【c++】内存管理

C/C内存管理 C/C内存分布 一个简单题 先试试看吧,答案在文章末尾给出 选择题: 选项: A.栈 B.堆 C.数据段(静态区) D.代码段(常量区) globalVar在哪里?____ staticGlobalVar在哪里?____ staticVar在哪里?____ localVar在…

【C++】开源:Eigen3矩阵与线性代数库配置使用

😏★,:.☆( ̄▽ ̄)/$:.★ 😏 这篇文章主要介绍Eigen3矩阵与线性代数库配置使用。 无专精则不能成,无涉猎则不能通。——梁启超 欢迎来到我的博客,一起学习,共同进步。 喜欢的朋友可以关注一下&…

problem(3):python IDE和python解释器

为什么写这篇文章呢?遇到了下面的问题,相同的解释器,如果运行angr库的代码,会出现 这样的情况,但是用spyder IDE 会显示正常,很奇怪 应该就是IDE的原因 IDE的循环导入问题 检查IDE配置: 如果可…

一百四十四、Kettle——Linux上安装的kettle8.2连接MySQL数据库

一、目的 在Linux上安装好kettle,然后用kettle连接MySQL数据库 注意:kettle版本是8.2 二、实施步骤 (一)到kettle安装目录下启动Linux的kettle服务 # cd /opt/install/data-integration/ # ./spoon.sh (二&#x…

SpringBoot搭建WebSocket初始化

1.java后端的maven添加websocket依赖 <!-- websocket依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></dependency>2.实例化ServerEndpointExport…

踩坑(5)整合kafka 报错 java.net.UnknownHostException: 不知道这样的主机

java.net.UnknownHostException: 不知道这样的主机。 (5c0c3c629db9)at java.base/java.net.Inet6AddressImpl.lookupAllHostAddr(Native Method) ~[na:na]at java.base/java.net.InetAddress$PlatformNameService.lookupAllHostAddr(InetAddress.java:933) ~[na:na]at java.ba…

uniapp封装request请求

在基础文件里面创建一个api文件 在创建两个 js文件 http.js 里面封装 request 请求 let baseUrl https://white.51.toponet.cn; //基地址 export const request (options {}) > {//异步封装接口&#xff0c;使用Promise处理异步请求return new Promise((resolve, reject…

时间复杂度为O(nlogn)的两种排序算法

1.归并排序 归并排序的核心思想&#xff1a;如果要排序一个数组&#xff0c;我们先把数组从中间分成前后两部分&#xff0c;然后对前后两部分分别排序&#xff0c;再将排好序的两部分合并在一起&#xff0c;这样整个数组就都有序了。 归并排序使用的就是分治思想。分治&#x…

IDEA强大的VisualGC插件

前言 开发阶段实时监测&#xff0c;自己的JVM信息&#xff0c;实时可视化 Hotspot JVM 垃圾回收监控工具, 支持查看本地和远程JVM进程, 支持G1 and ZGC算法。 插件安装 在线安装 IntelliJ IDEA 可通过在线安装的方式&#xff0c;安装插件 JDK VisualGC&#xff0c;安装步骤: …

DAY02_Spring第三方资源配置管理Spring容器Spring注解开发Spring整合Mybatis和Junit

目录 一 第三方资源配置管理1 管理DataSource连接池对象问题导入1.1 管理Druid连接池1.2 管理c3p0连接池 2 加载properties属性文件问题导入2.1 基本用法2.2 配置不加载系统属性2.3 加载properties文件写法 二 Spring容器1 Spring核心容器介绍问题导入1.1 创建容器1.2 获取bean…

阿里云平台WoSignSSL证书应用案例

沃通CA与阿里云达成合作并在阿里云平台上线WoSign品牌SSL证书。自上线以来&#xff0c;WoSignSSL证书成为阿里云“数字证书管理服务”热销证书产品&#xff0c;获得阿里云平台客户认可&#xff0c;助力阿里云平台政府、金融、教育、供应链、游戏等各类行业客户实现网站系统数据…

最全大数据毕业设计题目 - 100例

文章目录 0 前言1 如何选题1.1 选题技巧&#xff1a;如何避坑(重中之重)1.2 为什么这么说呢&#xff1f;1.3 难度把控1.4 题目名称1.5 最后 2 大数据 - 选题推荐2.1 大数据挖掘类2.2 大数据处理、云计算、区块链 毕设选题2.3 大数据安全类2.4 python大数据 游戏设计、动画设计类…

举办活动发布会,如何得到媒体支持?

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 举办活动发布会并得到媒体报道的支持是一个关键的宣传和推广手段。以下是一些建议&#xff0c;帮助你增加吸引媒体关注和报道的机会&#xff1a; 1. 策划新闻价值&#xff1a;确保你的发…

从0到1框架搭建,Python+Pytest+Allure+Git+Jenkins接口自动化框架(超细整理)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 接口测试是对系统…

为机器人装“大脑” 谷歌发布RT-2大模型

大语言模型不仅能让应用变得更智能&#xff0c;还将让机器人学会举一反三。在谷歌发布RT-1大模型仅半年后&#xff0c;专用于机器人的RT-2大模型于近期面世&#xff0c;它能让机器人学习互联网上的文本和图像&#xff0c;并具备逻辑推理能力。 该模型为机器人智能带来显著升级…

剑指Offer 58.左旋转字符串

58.左旋转字符串 目录 58.左旋转字符串题目代码&#xff08;字符串拼接&#xff09;利用切片函数同余简化代码利用StringBuilder 面试&#xff1a;StringBuilder与String的使用比较 题目 官网地址 代码&#xff08;字符串拼接&#xff09; class Solution {public String r…

【深度学习】在 MNIST实现自动编码器实践教程

一、说明 自动编码器是一种无监督学习的神经网络模型&#xff0c;主要用于降维或特征提取。常见的自动编码器包括基本的单层自动编码器、深度自动编码器、卷积自动编码器和变分自动编码器等。 其中&#xff0c;基本的单层自动编码器由一个编码器和一个解码器组成&#xff0c;编…