MySQL 更新语句是怎么执行的

news2025/1/16 7:51:20

更新语句的执行流程

    • 更新语句的执行流程图
    • 为什么要两阶段提交呢?

更新语句的执行流程图

更新语句的执行是 Server 层和引擎层配合完成,数据除了要写入表中,还要记录相应的日志。

update 语句的执行流程图,图中浅色框表示是在 InnoDB 内部执行的,深色框表示是在执行器中执行的。

update 语句执行流程

  1. 执行器先找引擎获取 ID=2 这一行。ID 是主键,存储引擎检索数据,找到这一行。如果 ID=2 这一行所在的数据页本来就在内存中,就直接返回给执行器;否则,需要先从磁盘读入内存,然后再返回。
  2. 执行器拿到引擎给的行数据,把这个值加上 1,比如原来是 N,现在就是 N+1,得到新的一行数据,再调用引擎接口写入这行新数据。
  3. 引擎将这行新数据更新到内存中,同时将这个更新操作记录到 redo log 里面,此时 redo log 处于 prepare 状态。然后告知执行器执行完成了,随时可以提交事务。
  4. 执行器生成这个操作的 binlog,并把 binlog 写入磁盘。
  5. 执行器调用引擎的提交事务接口,引擎把刚刚写入的 redo log 改成提交(commit)状态,更新完成。

从上图可以看出,MySQL 在执行更新语句的时候,在服务层进行语句的解析和执行,在引擎层进行数据的提取和存储;同时在服务层对 binlog 进行写入,在 InnoDB 内进行 redo log 的写入。

不仅如此,在对 redo log 写入时有两个阶段的提交,一是 binlog 写入之前prepare状态的写入,二是 binlog 写入之后commit状态的写入。

在这里插入图片描述

为什么要两阶段提交呢?

  1. 先写 redo log 后写 binlog。 假设在 redo log 写完,binlog 还没有写完的时候,MySQL 进程异常重启。由于我们前面说过的,redo log 写完之后,系统即使崩溃,仍然能够把数据恢复回来,所以恢复后这一行 c 的值是 1。
    但是由于 binlog 没写完就 crash 了,这时候 binlog 里面就没有记录这个语句。因此,之后备份日志的时候,存起来的 binlog 里面就没有这条语句。
    然后你会发现,如果需要用这个 binlog 来恢复临时库的话,由于这个语句的 binlog 丢失,这个临时库就会少了这一次更新,恢复出来的这一行 c 的值就是 0,与原库的值不同。

先写 redo log,后写 bin log 的问题

  1. 先写 binlog 后写 redo log。 如果在 binlog 写完之后 crash,由于 redo log 还没写,崩溃恢复以后这个事务无效,所以这一行 c 的值是 0。但是 binlog 里面已经记录了“把 c 从 0 改成 1”这个日志。所以,在之后用 binlog 来恢复的时候就多了一个事务出来,恢复出来的这一行 c 的值就是 1,与原库的值不同。

先写 bin log,后写 redo log 的问题

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

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

相关文章

为何反射探针关闭Mipmap后变成了白图

1)为何反射探针关闭Mipmap后变成了白图 2)2021.3 Android从AssetBundle中加载视频播放失败问题 3)SBP是否可以解决打包时FBX等模型文件中额外的GameObject 4)Addressables加载已打包过的Prefab后Mono脚本丢失 这是第349篇UWA技术知…

CSS3D+动画

CSS3D 1.css3D 给父元素设置 perspective:景深:近大远小的效果900-1200px这个范围内 transform-style:是否设置3D环境 flat 2D环境 默认值 perserve-3D环境 3D功能函数 1.位移: translateZ()translate3D(x,y,z) <!DOCTYPE html> <html lang"en"><h…

【Python小练习】利用DES进行加密解密

from Crypto.Cipher import DES from Crypto.Util.Padding import pad, unpad import json# 创建 DES 加密对象 key b123456 # 8字节的密钥&#xff0c;注意必须为字节类型 cipher DES.new(key, DES.MODE_ECB)# 加密 def encrypt_data(data):plaintext json.dumps(data).en…

安防视频监控/视频集中存储/云存储平台EasyCVR平台无法播放HLS协议该如何解决?

视频云存储/安防监控EasyCVR视频汇聚平台基于云边端智能协同&#xff0c;支持海量视频的轻量化接入与汇聚、转码与处理、全网智能分发、视频集中存储等。音视频流媒体视频平台EasyCVR拓展性强&#xff0c;视频能力丰富&#xff0c;具体可实现视频监控直播、视频轮播、视频录像、…

【Java基础篇】一文搞懂Java方法的调用与重载(超详细)

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【JavaSE_primary】 目录 一、方法的概念以及使用1.1什么是方法1.2方法定义1.3方法调用的执行过程1.4形参和实参的关系 二、方法的重载方…

MT4中如何设置Heikin-Ashi图表,10秒钟教会

所有人都在告诉你&#xff0c;在MT4中使用Heikin-Ashi烛台图表能在交易中盈利&#xff0c;但没有人告诉如何在MT4中添加Heikin-Ashi图表&#xff0c;如何设置Heikin-Ashi图表&#xff0c;其实很简单&#xff0c;FPmarkets澳福10秒钟教会&#xff0c;如果不好使&#xff0c;FPma…

VS2008统计代码行数

1.利用组合键&#xff08;ctrl shift F&#xff09;&#xff0c;查找&#xff1a; b*[^:b#/].*$ 结果如下&#xff1a; 如图所示&#xff0c;一共 104093行代码。

【网络安全防护】上海道宁与Bitdefender帮助您构建弹性网络并降低安全运营成本

在网络的世界中 风险变得更加常见与复杂 企业需要从网络安全转向网络弹性 复杂的网络攻击已非常普遍 在面临攻击时 企业如何保持业务连续性&#xff1f; Bitdefender GravityZone将 风险分析、安全加固、威胁预防 检测和响应功能相结合 帮助您构建弹性网络 并降低安全…

vue集成mars3d后,basemaps加不上去

首先&#xff1a; <template> <div id"centerDiv" class"mapcontainer"> <mars-map :url"configUrl" οnlοad"onMapload" /> </div> </template> <script> import MarsMap from ../component…

如何利用 CRM 做好销售渠道管理?

销售渠道管理是成功销售战略的一个重要方面。它涉及建立、跟踪和组织销售流程的各个阶段&#xff0c;以确保顺利、高效地将潜在客户转化为付费客户。 销售渠道管理为跟踪和优先处理交易提供了一个清晰的框架&#xff0c;采用销售渠道漏斗模板可以进一步简化流程。通过有效管理…

Linux系统下vim常用命令

一、基础命令&#xff1a; v:可视模式 i:插入模式 esc:命令模式下 :q &#xff1a;退出 :wq &#xff1a;保存并退出 ZZ&#xff1a;保存并退出 :q! &#xff1a;不保存并强制退出二、在Esc下&#xff1a; dd : 删除当前行 yy:复制当前行 p:复制已粘贴的文本 u:撤销上一步 U:…

使用Python和systemctl管理Linux系统服务的简便工具

前言 本文介绍了一个实用工具&#xff0c;用于在Linux系统上管理systemctl服务。该工具提供了创建、安装、卸载、启动和停止服务的功能&#xff0c;帮助用户轻松地管理和控制正在运行的服务。 通过使用该代码&#xff0c;你可以轻松地执行以下操作&#xff1a; 创建服务文件&…

解决centos离线安装cmake找不到OpenSSL问题

安装方法&#xff1a;见另外一篇文章 https://blog.csdn.net/zhongxj183/article/details/118488629 按照文章下载了离线gcc 和OpenSSL&#xff0c;以及在cmake官网下载了最新版 cmake-3.27.4.tar.gz 顺利安装gcc 和OpenSSL 但执行编译cmake时&#xff0c;报错找不到OpenSSL…

软考A计划-网络工程师-必考知识点-下

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列 &#x1f449;关于作者 专注于Android/Unity和各种游…

液冷连接器快速接头

液冷连接器快速接头常用介质 水、乙二醇水溶液、纯乙二醇、空调制冷剂和硅油等。 液冷连接器快速接头应用 强振动冷却回路手动连接雷达数据中心电子冷却吊舱 液冷连接器快速接头材质 主体材料不锈钢或经表面处理的铝合金 密封圈选用低温硅橡胶或HNBR 液冷连接器快速接头主…

5G智能网关如何解决城市停车痛点难点

2023年上半年&#xff0c;我国汽车新注册登记1175万辆&#xff0c;同比增长5.8%&#xff0c;88个城市汽车保有量超过100万辆&#xff0c;北京、成都等24个城市超过300万辆。随着车辆保有量持续增加&#xff0c;停车难问题长期困扰城市居民&#xff0c;也导致城市路段违停普遍、…

架构设计:Docker容器化部署

在现代软件开发和部署中&#xff0c;Docker 容器化技术已经成为一种重要的解决方案。它不仅简化了应用程序的构建和部署过程&#xff0c;还提供了跨环境一致性、可移植性和高效性。本文将介绍一个完整的 Docker 容器化部署架构设计&#xff0c;帮助您深入了解如何将应用程序成功…

mysql中的with

概念 WITH 子句是 MySQL 中的一种 SQL 结构&#xff0c;又称为 Common Table Expression (CTE)。它在不影响原有 SQL 语句的情况下&#xff0c;允许开发人员临时创建一个内存中的结果集&#xff0c;然后对其进行操作。 作用 WITH 子句的主要用途是创建一个暂时的结果集&…

NewStarCTF 2022 web方向题解 wp

----------WEEK1---------- BUU NewStarCTF 公开赛赛道 WEEK1 [NotPHP] 先看题目&#xff0c;要传参加绕过。 分析一下代码&#xff1a;首先get一个datadata://test/plain,Wel…。然后key1和2用数组可以绕过。num2077a可以绕过弱类型。eval()中的php语句被#注释了&#xff0c…

SpringBoot中间件ElasticSearch

Elasticsearch是一个基于 Lucene 的搜索服务器。它提供了一个分布式多用户能力的 全文搜索引擎 &#xff0c;基于RESTful web 接口。 Elasticsearch 是用 Java 语言开发的&#xff0c;并作为 Apache 许可条款下的开放源码发布&#xff0c;是一种流行的企业级搜索引擎。Elastics…