UPDATE语句的完整执行过程

UPDATE test SET a=1 WHERE id=2

为例,完整讲解执行流程。


一、核心概念速记

在开始之前,你需要记住三个日志文件的作用:

  • undo log:用于事务回滚,记录数据修改前的旧值
  • redo log:用于崩溃恢复,记录数据修改后的新值
  • binlog:用于主从复制和数据恢复,记录所有数据变更

二、执行步骤详解

第一步:记录undo log(事务准备阶段)

事务开始时,MySQL会先记录undo log。

操作:UPDATE test SET a=1 WHERE id=2 undo log记录: ┌─────────────────────┐ │ 操作类型:UPDATE │ │ 表名:test │ │ id = 2的旧值:a=0 │(假设原来a的值是0) └─────────────────────┘

为什么需要undo log?

如果你执行了UPDATE,然后想回滚(ROLLBACK),MySQL就用undo log里的旧值把数据改回去。

BEGIN; UPDATE test SET a=1 WHERE id=2; -- undo log记录 a原来是0 ROLLBACK; -- 用undo log把a改回0

第二步:写redo log(prepare阶段)

undo log记录完后,存储引擎(InnoDB)会写入redo log,并标记状态为prepare

redo log内容: ┌──────────────────────────────────┐ │ 操作类型:UPDATE │ │ id=2, a=1(新值) │ │ 状态:prepare(准备中) │ └──────────────────────────────────┘ ↓ (立即刷入磁盘) 磁盘中的redo log file

这一步的意义:

  • 保证即使系统崩溃,通过redo log也能恢复数据
  • 只有写到磁盘的redo log才真正安全
  • 状态是prepare,说明还没有最终提交

第三步:获取行锁并修改数据(执行阶段)

写完redo log后,MySQL获取行锁在内存中修改数据

步骤流程: 1. 获取id=2这一行的行锁 ↓ 2. 从磁盘读入内存(buffer pool) - 读到:id=2, a=0(旧值) ↓ 3. 在内存中修改 - 改为:id=2, a=1(新值) ↓ 4. 标记为脏页(dirty page) - 说明这个数据页的内存版本和磁盘版本不一致

注意:此时数据还在内存中,没有写入磁盘!

这是InnoDB的优化策略:

  • 立即写磁盘很慢(每次都做磁盘IO)
  • 先在内存中修改,标记为脏页
  • 后台有线程在适当时机将脏页刷入磁盘

第四步:写入binlog(服务层记录)

binlog是MySQL服务层维护的日志,不是存储引擎的。

在事务提交前,MySQL会将操作写入binlog。

binlog内容: ┌──────────────────────────────────┐ │ UPDATE test SET a=1 WHERE id=2 │ │ 时间戳:2025-01-07 10:30:00 │ │ 连接ID:12345 │ └──────────────────────────────────┘ binlog主要用途: 1. 主从复制:从库读主库的binlog来同步数据 2. 数据恢复:结合备份文件,恢复到某个时间点

第五步:提交事务(commit阶段)

这是关键的一步!包含两个操作:

操作1:修改redo log状态为commit

redo log状态变化: prepare → commit redo log: ┌──────────────────────────────────┐ │ 操作类型:UPDATE │ │ id=2, a=1 │ │ 状态:commit(已提交) │ └──────────────────────────────────┘ 立即刷入磁盘

操作2:释放行锁

操作完成,释放id=2这一行的锁 其他事务现在可以修改id=2的数据了


三、两阶段提交(Two-Phase Commit)

这是确保redo log和binlog一致性的机制,也是为什么MySQL的可靠性这么高的原因。

第一阶段(Prepare): ↓ redo log写入磁盘,状态=prepare ↓ 不能立即提交,要等binlog写完 第二阶段(Commit): ↓ binlog写入磁盘 ↓ redo log状态改为commit,写入磁盘 ↓ 事务最终完成

为什么要这样设计?

假设没有两阶段提交:

场景1:只写redo log不写binlog

UPDATE执行了 → 主库数据改了 → 从库没收到 →主从数据不一致!

场景2:只写binlog不写redo log

UPDATE执行了 → binlog记录了 →系统崩溃 → 无法恢复数据!

两阶段提交保证:

  • 要么redo log和binlog都成功,数据最终一致
  • 要么都失败,系统可以恢复到之前的状态

四、崩溃恢复场景

如果在commit阶段崩溃了怎么办?

假设:redo log已经写入(prepare),binlog已经写入, 但redo log的commit状态还没写入磁盘就崩溃了 MySQL重启后: 1. 扫描redo log 2. 看到这个操作状态是prepare 3. 查看binlog中是否有对应的操作记录 4. 如果binlog中有,说明操作已经完成,就把redo log改为commit 5. 如果binlog中没有,说明操作没完成,就回滚这个操作

五、完整时间线总结

UPDATE test SET a=1 WHERE id=2 执行过程: 时间点1:事务开始 → 记录undo log(id=2, a原来的值) 时间点2:执行阶段 → 写redo log(prepare状态) → 获取行锁 → 在buffer pool中修改数据为a=1 → 标记为脏页 时间点3:提交阶段开始 → 写binlog(用于主从复制) 时间点4:提交阶段完成 → 修改redo log状态为commit → 释放行锁 → 事务完成! 时间点5:后台线程(不一定立即) → 将脏页刷入磁盘 → 如果故障恢复需要,redo log可以帮忙恢复

六、需要理解:

  1. 为什么INSERT/UPDATE/DELETE很慢?

    • 因为要做这么多事:写undo log、写redo log、写binlog、获取锁、修改数据、提交事务
    • 所以:批量操作用batch比逐条执行快得多
  2. 为什么MySQL这么可靠?

    • 多层日志保护(undo log、redo log、binlog)
    • 两阶段提交确保数据一致性
    • 即使系统崩溃也能恢复
  3. 主从复制为什么会延迟?

    • 因为从库是从主库的binlog读取数据
    • 主库写完数据后,从库需要网络传输、解析、执行
    • 这之间有延迟
  4. 数据库性能优化的角度:

    • redo log的大小和io_capacity参数很重要
    • 批量操作时用事务分组,减少提交次数
    • 避免频繁的小事务

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

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

相关文章

一个基于 Node.js 和 FFmpeg 的视频合并 CLI 工具,支持为视频添加片头、片尾,以及批量处理多个视频文件。

Video Merger CLI (vvm) 一个基于 Node.js 和 FFmpeg 的视频合并 CLI 工具,支持为视频添加片头、片尾,以及批量处理多个视频文件。 功能特性 ✅ 视频合并:将两个视频合并为一个(支持开头或结尾位置)✅ 批量处理&#…

[特殊字符]_网络IO性能优化:从TCP到HTTP的层层优化[20260107164433]

作为一名专注于网络性能优化的工程师,我在过去的项目中积累了丰富的网络IO优化经验。最近,我参与了一个对网络性能要求极高的项目——实时视频流平台。这个项目让我重新审视了Web框架在网络IO方面的表现。今天我要分享的是基于真实项目经验的网络IO性能优…

AI改图工具实操,冬装白底图快速生成高点击场景图

冬季服饰上新视觉太费劲儿!外景拍摄又冷又贵还等档期,PS 抠图易虚边、光影违和显廉价。用AI指令改图,上传白底模特图,输指令就能换场景姿势,服饰细节1:1还原,十几秒出图可批量,商用无忧&#xf…

电影解说从0到1,要准备哪些工具?一套能跑通的实战清单

电影解说,本质上不是创意竞赛,而是一套高度标准化的内容生产流程。 你做不出来第一条,大多数时候不是能力问题,而是工具选错、流程没搭好。这篇内容不讲空泛的方法论,而是按一条已经被大量账号验证过的电影解说流水线&…

⚡_延迟优化实战:从毫秒到微秒的性能突破[20260107164942]

作为一名专注于系统性能优化的工程师,我在过去十年中一直致力于降低Web应用的延迟。最近,我参与了一个对延迟要求极其严格的项目——金融交易系统。这个系统要求99.9%的请求延迟必须低于10ms,这个要求让我重新审视了Web框架在延迟优化方面的潜…

SQLi-Labs搭建及通关

**在 Windows 电脑上安装 sqlmap 并搭建 SQLi-Labs,需要先配置Python 环境(支撑 sqlmap)和XAMPP 环境(集成 ApacheMySQLPHP,支撑 SQLi-Labs)。 一、工具下载: 1、Python(sqlmap 依赖…

[特殊字符]_可扩展性架构设计:从单体到微服务的性能演进[20260107163924]

作为一名经历过多次系统架构演进的老兵,我深知可扩展性对Web应用的重要性。从单体架构到微服务,我见证了无数系统在扩展性上的成败。今天我要分享的是基于真实项目经验的Web框架可扩展性设计实战。 💡 可扩展性的核心挑战 在系统架构演进过…

[特殊字符]_压力测试与性能调优的完整指南[20260107165451]

作为一名经历过无数次压力测试的工程师,我深知压力测试在性能调优中的重要性。压力测试不仅是验证系统性能的必要手段,更是发现性能瓶颈和优化方向的关键工具。今天我要分享的是基于真实项目经验的压力测试与性能调优完整指南。 💡 压力测试…

一文讲清:主流大模型推理部署框架:vLLM、SGLang、TensorRT-LLM、ollama、XInference

本文系统性梳理当前主流的大模型推理部署框架,包括vLLM、SGLang、TensorRT-LLM、Ollama、XInference等。 随着大语言模型技术的迅猛演进,推理部署框架作为贯通模型能力与落地应用的核心枢纽,其战略价值正持续攀升。本文旨在对当前业界广泛采…

豆包本地文件问答下线后的打开方法

豆包本地文件问答下线后的打开方法关键词:豆包本地文件问答、豆包离线问答、本地知识库、doubao 本地模型、RTX AI PC、本地 AI 问答一次“功能下线”带来的意外发现前段时间在整理本地资料的时候,我发现豆包的「本地文件问答」功能页面多了一个提示&…

【光子AI 2026 企业级 Agent 架构指南】别再把 Skill 当 Tool:Agent Skills × MCP 企业级落地全指南(最新定义澄清 + 场景大全 + 选型决策树+安全工程清单)

文章目录 拒绝“手搓”Agent:2026企业级架构指南——彻底搞懂 Agent Skills 与 MCP 的边界与选型 🚀 引言:AI 开发的“草莽时代”结束了 第一部分:正本清源——最新官方定义解读 1. Agent Skills:让 Agent 变“专家”的文件夹 2. MCP:AI 应用的“USB-C 接口” 第二部分:…

格雷希尔:G15F-KFYK-FD39 定制款快速密封连接器,适配自动化产线,赋能电驱动通讯接口的自动化密封测试

某新能源设备商联系到我们,为其电驱动上的通讯接口采购一批快速密封连接器用于气密性测试,该生产线为自动化产线,对连接器的适配性、稳走性、耐用性均提出了极高要求。格雷希尔定制款 G15F-KFYK-FD39 自动化连接器格雷希尔定制款 G15F-KFYK-F…

如何判断光耦 PC817 的好坏

判断光耦 PC817 的好坏对于开关电源电路板的维修非常重要:1. 光耦的功能隔离信号:PC817 可以有效隔离高压输入和低压控制电路,保护电路元件和人员安全。信号传输:光耦用于实现数据的可靠传输,特别是在噪声较大的环境中…

Go 语言的“舒适区”:为何在这张“鄙视链”金字塔中,Go 仅次于 C?

大家好,我是Tony Bai。最近,一张“编程语言分级图”在技术社区引发大家热议。它没有参考 TIOBE 排名,也不看 GitHub Star 数,而是完全基于一种简单粗暴的价值观:谁最不折腾人?在这张金字塔中,C …

大模型AI学习路线:从提示词工程到模型部署的全栈教程,90天变身高薪工程师

文章提供四阶段大模型学习路径:初阶应用(10天)掌握提示词工程,高阶应用(30天)学习RAG系统,模型训练(30天)实现微调,商业闭环(20天)完成部署。涵盖大模型基础知识、智能体开发、私有化部署等核心技能,提供实战项目和工具…

什么是企业机器人流程自动化RPA

企业RPA (Robotic Process Automation) 中文名:机器人流程自动化 本质:一种模拟人在计算机上执行规则明确、重复性高工作的软件“数字员工”。---一、核心功能(它能做什么?)它像一位不知疲倦、零错误的白领机器人&…

【分布式系统】02 现实世界的法则 —— 分布式系统的定义、模型与核心挑战

大家好,我是Tony Bai。欢迎来到《分布式系统:原理、哲学与实战》微专栏的第二讲。在上一讲中,我们告别了秩序井然的单体城堡,决定踏入广阔的分布式联邦。但在正式探索之前,我们必须回答一个根本问题:我们所…

分区操作系统、容器化、虚拟机的概念

分区操作系统(通常指分时操作系统)与 Docker 是完全不同层面的技术,分别解决不同的问题。简单来说: 分区操作系统:是一种操作系统类型,管理单个硬件上的多个用户/任务。Docker:是一个应用容器…

2025年广州市“人工智能+”典型案例集|附118页PDF文件下载

《广州市“人工智能”典型案例集》展示了AI在各领域的应用。关键点包括:AI制造:智能座舱、多模态大模型应用、PCB项目等,提升效率与精度。AI安全:智能机器狗、安全大模型、AI安管一体机等,保障公共安全。AI教育&#x…

FastAPI + LangGraph + Multi-Agent 完整工程源代码实现:含真实目录结构, Gateway / Agent / Tool / Memory 分层,完整源代码实现

FastAPI + LangGraph + Multi-Agent 完整工程源代码实现:含真实目录结构, Gateway / Agent / Tool / Memory 分层,完整源代码实现 FastAPI + LangGraph + Multi-Agent 完整工程源代码实现 这一章给出一个“能跑起来”的最小完整工程,把你要的 Gateway / Agent / Tool / M…