分布式事务

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

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

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

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

事务的特性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.hqwc.cn/news/52127.html

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

相关文章

uniapp 使用iconfont

问题描述:在开发过程中会遇到使用自定义icon的情况,在uniapp项目中使用iconfont步骤如下。 问题解决 步骤一: 打开iconfont网址------我的项目-----下载至本地 下载成功的文件内容: 步骤二: 以管理员身份运行终端&am…

利用prophet实现时间序列数据结果预测及对预测数据进行年度趋势和月度值分解

第一部分:prophet的介绍 选取一段chatgpt对该插件的解释,如下: Prophet(预言家)是由Facebook开发的开源时间序列分析工具,旨在提供一个简单而强大的框架,用于预测时间序列数据。Prophet的设计目…

kubernetes 集群利用 efk 收集容器日志

文章目录 [toc]前情提要制作 centos 基础镜像准备 efk 二进制文件部署 efk 组件配置 namespace配置 gfs 的 endpoints配置 pv 和 pvc部署 elasticsearchefk-cmefk-svcefk-sts 部署 filebeatfilebeat-cmfilebeat-ds 部署 kibanakibana-cmkibana-svckibana-dp使用 nodeport 访问 …

虹科新品丨RevPi Connect 4系列:基于树莓派CM4计算模块的全新工业树莓派

新品来袭 势不可挡 备受期待的虹科工业树莓派第四代产品—RevPi Connect 4终于来啦!作为全球领先的工业自动化产品,RevPi Connect 4融合了工业树莓派多年技术积累与创新突破,以及现代物联网技术的结晶。无论您是行业领先者、工程师还是智能科…

Android系统APP之SettingsProvider

前言 SettingsProvider顾名思义是一个提供设置数据共享的Provider,SettingsProvider和Android系统其它Provider有很多不一样的地方,如: SettingsProvider只接受int、float、string等基本类型的数据;SettingsProvider由Android系…

2023年我想开信用账户!融资融券开通佣金最低是多少?两融利率低至5%!

2023年融资融券开通佣金最低是多少?两融利率低至5%! 随着科技的不断发展和金融市场的日益完善,2023年的融资融券市场将迎来更加便捷和低成本的交易方式。据悉,融资融券开通佣金最低仅为5%,且利率也将进一步降至5%左右。…

Vue3 watch监听器

概览:watch监听器的定义以及使用场景。在vue3中的监听器的使用方式,watch的三个参数,以及进一步了解第一个参数可以是一个属性,也可以是一个数组的形式包含多个属性。 watch在vue3和vue2中的使用: vue3中&#xff1a…

考研408 | 【计算机网络】概述

计算机网络体系结构 计算机网络概述:1.概念,组成,功能,分类2.标准化工作及相关组织3.性能指标体系结构&参考模型:1.分层结构2.协议,接口,服务3.ISO/OSI模型4.TCP/IP模型 目录 计算机网络体…

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

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

《每天5分钟玩转kubernetes》读书笔记

笔记 概念 Pod是脆弱的,但应用是健壮的。 kubelet运行在Cluster所有节点上,负责启动Pod和容器。kubeadm用于初始化Cluster。kubectl是k8s命令行工具。通过kubectl可以部署和管理应用,查看各种资源,创建、删除和更新各种组件。 …

vue-cli3项目优化

首先添加两个量化的插件,方便对项目目前的情况进行分析: 1.添加speed-measure-webpack-plugin插件 —量化的指标可以看出前后对比 使用步骤: 安装speed-measure-webpack-plugin依赖 npm install speed-measure-webpack-plugin -D配置vue.c…

【Leetcode刷题】位运算

本篇文章为 LeetCode 位运算模块的刷题笔记,仅供参考。 位运算的常用性质如下: a ^ a 0 a ^ 0 a a ^ 0xFFFFFFFF ~a目录 一. 基本位运算Leetcode29.两数相除Leetcode89.格雷编码 二. 位运算的性质Leetcode136.只出现一次的数字Leetcode137.只出现一…