两阶段提交进阶

两阶段提交之进阶

上一节我们讲了,两阶段提交逻辑上的表现,其实较为肤浅,并且偏向理论,可能大家都能看懂,但是如果放入实际的mysql应用中并联系事务和日志进行分析,又会怎么样呢?

这次就专门分析两阶段提交在mysql更新操作中的必要性;(定语加的有够多的🏋️‍♂️);

既然在mysql中,那必然是要知道mysql的更新操作是如何进行的,才能分析两阶段提交为何必要;

mysql更新操作

对于一个单体数据库中,一个简单的mysql操作通常会分为:

1.解析sql语句并进行优化;

2.开始事务

3.加锁,对更新涉及到的数据加锁

4.执行更新操作并将操作记录到日志中,以支持回滚和恢复

5.提交事务,释放锁,返回结果;

可以看到在这过程中对于更新数据以及日志的操作都是在事务范围内进行的;

接下来分析日志在这个过程中的变化:

  1. 二进制日志(Binary Log)的记录:MySQL会将执行的更新操作记录到二进制日志中,这包括对数据的插入、更新和删除操作。二进制日志记录在事务提交之前。Binlog通常用于数据的备份和复制,以及在主从复制架构中用于数据同步
  2. Redo日志的生成:MySQL会生成Redo日志,记录已经提交的事务对数据的修改。Redo日志用于数据库的崩溃恢复,在数据库重启时,MySQL会根据Redo日志将已提交的事务重新应用到数据库中,确保数据的一致性。称为重做日志
  3. Undo日志的生成:在事务进行过程中,MySQL会生成Undo日志,记录事务对数据的修改前的状态(记录了事务对数据库所做的修改的逆操作)。Undo日志用于事务的回滚操作,在事务回滚时,MySQL会根据Undo日志将数据恢复到事务开始之前的状态。称为撤销日志

我们接着分析,如果使用两阶段提交协议那么对于一个分布式的数据库进行更新操作时,应该按照怎么样的顺序执行呢

在准备阶段

  • 协调者节点向所有参与者节点发送Prepare请求,要求它们准备提交事务。
  • 参与者节点执行更新操作的准备工作,预留资源、写入Redo日志和Undo日志等,并向协调者节点发送准备就绪的响应。

如果没有两阶段提交,一旦在提交阶段发生了故障,可能会导致一些参与者节点已经准备好提交事务,而另一些参与者节点却无法准备就绪。这种情况下,数据可能会处于不一致的状态,从而破坏了数据的一致性和可靠性。

crash阶段(出现错误):

  • 在Prepare阶段之后,如果系统在提交事务之前发生了崩溃或者故障,就会进入Crash阶段。
  • 在Crash阶段,系统会通过Redo日志和Undo日志来进行故障恢复。
  • 通过Redo日志,系统可以重新应用已经提交的事务对数据的修改,以确保数据的持久性。
  • 通过Undo日志,系统可以撤销未提交的事务对数据的修改,以确保数据的一致性。

(在这个过程中,其实redo和undo作用和单体数据库作用是一样的,都是维持单体数据库的持久性和一致性);

如果没有两阶段提交,一旦在提交阶段发生了故障,可能会导致数据的更新操作部分应用到了数据库中,而另一部分未能成功应用。这种情况下,数据库可能会处于不一致的状态,从而破坏了数据的一致性和可靠性。

成功的话:第二阶段

commit阶段

  • 在Commit阶段,事务会被提交,即所有的数据修改操作将被应用到数据库中。
  • 在分布式环境中,可能需要将Commit请求发送给协调者节点,并等待协调者节点将Commit请求发送给各个参与者节点。
  • 只有当所有参与者节点都成功提交了事务后,事务才会被视为成功提交,否则事务将被回滚。
  • 在事务成功提交后,系统会确保相应的Redo日志、Undo日志和Binlog记录被正确地写入到持久化存储中,以保证数据的持久性和一致性。

如果没有两阶段提交,可能会导致已经提交的事务对数据的修改丢失,或者未提交的事务对数据的修改被错误地应用到了数据库中。这种情况下,数据库可能会处于不一致的状态。

扩展知识点

其实两阶段提交还有一个重要作用,防止半提交发生时造成的redo日志和binlog日志不统一

例:

image-20240417212833412

整个过程:

image-20240417212933166

从图中可看出,事务的提交过程有两个阶段,就是将 redo log 的写入拆成了两个步骤:prepare 和 commit,中间再穿插写入binlog,具体如下:

  • prepare 阶段:将 XID(内部 XA 事务的 ID) 写入到 redo log,同时将 redo log 对应的事务状态设置为 prepare,然后将 redo log 持久化到磁盘(innodb_flush_log_at_trx_commit = 1 的作用);
  • commit 阶段:把 XID 写入到 binlog,然后将 binlog 持久化到磁盘(sync_binlog = 1 的作用),接着调用引擎的提交事务接口,将 redo log 状态设置为 commit,此时该状态并不需要持久化到磁盘,只需要 write 到文件系统的 page cache 中就够了,因为只要 binlog 写磁盘成功,就算 redo log 的状态还是 prepare 也没有关系,一样会被认为事务已经执行成功;

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Unity类银河恶魔城学习记录13-1 p142 Save system源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释,可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili FileDataHandler.cs using System; using System.IO; using UnityEngine; p…

软考133-上午题-【软件工程】-软件项目估算

一、COCOMO 估算模型 COCOMO 模型是一种精确的、易于使用的成本估算模型。 COCOMO 模型按其详细程度分为:基本 COCOMO 模型、中级 COCOMO 模型和详细 COCOMO 模型。 1)基本 COCOMO 模型 基本 COCOMO 模型是一个静态单变量模型,用于对整个软…

内衣裤洗衣机如何选购?掌握这六个挑选技巧,轻松选购!

这两年内衣裤洗衣机可以称得上较火的小电器,小小的身躯却有大大的能力,一键可以同时启动洗、漂、脱三种全自动为一体化功能,在多功能和性能的提升上,还可以解放我们双手的同时将衣物给清洗干净,让越来越多小伙伴选择一…

node基础 第二篇

01 ffmpeg开源跨平台多媒体处理工具,处理音视频,剪辑,合并,转码等 FFmpeg 的主要功能和特性:1.格式转换:FFmpeg 可以将一个媒体文件从一种格式转换为另一种格式,支持几乎所有常见的音频和视频格式,包括 MP…

Node Version Manager(nvm):轻松管理 Node.js 版本的利器

文章目录 前言一、名词解释1、node.js是什么?2、nvm是什么? 二、安装1.在 Linux/macOS 上安装2.在 Windows 上安装 二、使用1.查看可安装的node版本2.安装node3. 查看已安装node4.切换node版本5.其它 总结 前言 Node.js 是现代 Web 开发中不可或缺的一部…

docker-compose 安装MongoDB续创建用户及赋权

文章目录 1. 问题描述2. 分析2.1 admin2.2 config2.3 local 3. 如何连接3.解决 1. 问题描述 在这一篇使用docker-compose创建MongoDB环境的笔记里,我们创建了数据库,但是似乎没有办法使用如Robo 3T这样的工具去连接数据库。连接的时候会返回这样的错误&…

c语言,单链表的实现----------有全代码!!!!

1.单链表的定义和结构 单链表是一种链式的数据结构,它用一组不连续的储存单元存反线性表中的数据元素。链表中的数据是以节点的形式来表示的,节点和节点之间相互连接 一般来说节点有两部分组成 1.数据域 :数据域用来存储各种类型的数据&…

基于SpringBoot+Vue的疾病防控系统设计与实现(源码+文档+包运行)

一.系统概述 在如今社会上,关于信息上面的处理,没有任何一个企业或者个人会忽视,如何让信息急速传递,并且归档储存查询,采用之前的纸张记录模式已经不符合当前使用要求了。所以,对疾病防控信息管理的提升&a…

windows 如何安装 perl ?

链接:https://strawberryperl.com/ 我们选择安装 “草莓 perl” 下载后根据引导安装就行了

node.jd版本降级/升级

第一步.先清空本地安装的node.js版本 按健winR弹出窗口,键盘输入cmd,然后敲回车(或者鼠标直接点击电脑桌面最左下角的win窗口图标弹出,输入cmd再点击回车键) 进入命令控制行窗口,输入where node,查看本地…

双指针的引入和深入思考(持续更新中)

目录 1.引入双指针 2.使用场景 3.例题引入 1.引入双指针 当我们需要维护某个区间性质的或者是求满足某些性质的区间的长度时,对于一个区间是由左右端点的,我们有简单的枚举左右端点的O()的时间的做法,当时在大多数题目中是不可行的&#…

DataX案例,MongoDB数据导入HDFS与MySQL

【尚硅谷】Alibaba开源数据同步工具DataX技术教程_哔哩哔哩_bilibili 目录 1、MongoDB 1.1、MongoDB介绍 1.2、MongoDB基本概念解析 1.3、MongoDB中的数据存储结构 1.4、MongoDB启动服务 1.5、MongoDB小案例 2、DataX导入导出案例 2.1、读取MongoDB的数据导入到HDFS 2…

论文笔记:Does Writing with Language Models Reduce Content Diversity?

iclr 2024 reviewer评分 566 1 intro 大模型正在迅速改变人们创造内容的方式 虽然基于LLM的写作助手有可能提高写作质量并增加作者的生产力,但它们也引入了算法单一文化——>论文旨在评估与LLM一起写作是否无意中降低了内容的多样性论文设计了一个控制实验&…

Kubernetes部署应用利器Helm详解

文章目录 一、helm概述&安装1.为什么需要Helm2.Helm介绍3.Helm架构4.部署Helm客户端5.Helm基本使用5.1 创建Chart示例 二、Helm 应用部署、升级1.创建项目(chat所需目录、文件)2.创建/拷贝项目的yaml文件到templates目录下3.使用Helm进行部署项目4.H…

第十五届蓝桥杯复盘python大学A组——试题B 召唤数学精灵

按照正常思路解决,由于累乘消耗大量时间,因此这不是一个明智的解决方案。 这段代码执行速度非常慢的原因在于它试图计算非常大的数的阶乘(累乘),并且对于每一个i的值都执行这个计算。阶乘的增长是极其迅速的&#xff…

49.HarmonyOS鸿蒙系统 App(ArkUI)Tab导航组件的使用

HarmonyOS鸿蒙系统 App(ArkUI)Tab导航组件的使用 图片显示 Row() {Image($r(app.media.leaf)).height(100).width(100)Image($r(app.media.icon)).height(100).width(100) } 左侧导航 import prompt from ohos.prompt; import promptAction from ohos.promptAction; Entry C…

vue2知识点1 ———— (vue指令,vue的响应式基础)

vue2的知识点,更多前端知识在主页,还有其他知识会持续更新 Vue 指令 Vue指令是Vue.js中的一个重要概念,用于向DOM元素添加特定行为或功能。Vue指令以v-开头,例如v-bind、v-if、v-for等。 v-bind 动态绑定属性 用法&#xff1a…

windows ubuntu 子系统:肿瘤全外篇,2. fq 数据质控,比对。

首先我们先下载一组全外显子测序数据。nabi sra库,随机找了一个。 来自受试者“16177_CCPM_1300019”(SRR28391647, SRR28398576)的样本“16177_CCPM_1300019_BB5”的基因组DNA配对端文库“0369547849_Illumina_P5-Popal_P7-Hefel”的Illumina随机外显子测序 下载下…

SGI_STL空间配置器源码剖析(一)总览

SGI 全称为 Silicon Graphics [Computer System] Inc. 硅图[计算机系统] 公司,SGI_STL是SGI实现的C的标准模板库。 SGI STL的空间配置器包括一级和二级两种。 一级空间配置器allocator采用malloc和free来管理内存,这与C标准库中提供的allocator是相似的…

VS集成vcpkg

VS集成vcpkg 下载vcpkg 下载vcpkg git clone https://github.com/Microsoft/vcpkg.git安装vcpgk,文件目录 .\bootstrap-vcpkg.bat集成到vs2022中 # 集成到项目 vcpkg integrate project vcpkg integrate installPS C:\Users\Administrator> vcpkg integrate…
最新文章