news 2026/2/2 20:15:01

进阶-InnoDB引擎-事务

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
进阶-InnoDB引擎-事务

一、MySQL进阶

“当两个银行账户同时转账时,你希望系统是‘要么全部成功,要么全部失败’,而不是让钱‘消失’或‘凭空多出’。”
—— 事务,是数据库的“保险丝”,也是高并发系统的“定海神针”

为什么事务如此重要?—— 一场银行转账的危机

想象一下:
用户A有 1000 元,用户B有 500 元。
执行转账操作:
A转500元给B

如果系统在中间出错:

  • A的余额减500 → 500元
  • B的余额未加500 → 仍500元
    结果:总金额从1500元变成1000元!

💡 这就是事务失败的灾难性后果
事务(Transaction)正是为了解决这个问题而诞生——确保数据操作的原子性与一致性

1. 事务

事务的四大特性:ACID的终极密码

特性含义问题InnoDB 解决方案
Atomicity(原子性)操作要么全部成功,要么全部失败部分成功导致数据不一致Undo Log:回滚到事务前状态
Consistency(一致性)事务前后数据必须符合约束约束被破坏(如余额<0)约束检查+事务回滚
Isolation(隔离性)并发事务互不影响脏读/不可重复读/幻读MVCC+锁机制
Durability(持久性)事务提交后数据永久保存服务器宕机导致数据丢失Redo Log+刷盘机制

事务隔离级别:从“混乱”到“有序”的四重境界

MySQL 提供4 种隔离级别,从低到高依次为:

📌 1. 读未提交(Read Uncommitted)
  • 允许:脏读、不可重复读、幻读
  • 场景:对数据一致性要求极低的场景(如日志统计)
  • InnoDB 行为不加锁,直接读取最新数据
📌 2. 读已提交(Read Committed)
  • 允许:不可重复读、幻读
  • 场景:大多数Web应用(如电商订单)
  • InnoDB 行为MVCC + 语句级锁,每次查询都读取最新已提交数据
📌 3. 可重复读(Repeatable Read)✅(MySQL默认)
  • 允许:幻读
  • 场景:金融、银行系统(要求每次查询结果一致)
  • InnoDB 行为MVCC + 快照读RR级别下通过Next-Key Lock避免幻读
📌 4. 串行化(Serializable)
  • 禁止:所有并发问题
  • 场景:极端严格一致性要求(如股票交易)
  • InnoDB 行为强制加锁,所有事务串行执行

锁机制:事务的“守门员”

InnoDB 采用行级锁(而非表级锁),但锁类型复杂:

📌 1. 共享锁(S Lock)
  • 作用SELECT ... FOR SHARE
  • 特点:多个事务可以同时持有
  • 场景:读取数据时加锁,防止其他事务修改
📌 2. 排他锁(X Lock)
  • 作用UPDATE/DELETE/SELECT FOR UPDATE
  • 特点:独占锁,其他事务不能加任何锁
  • 场景:修改数据时
📌 3. 意向锁(Intention Lock)
  • 作用:表明事务想加行锁(避免表锁冲突)
  • 类型
    • IS(意向共享锁):事务想加S锁
    • IX(意向排他锁):事务想加X锁

MVCC:多版本并发控制——事务的“时间机器”

MVCC(Multi-Version Concurrency Control)是 InnoDB 实现高并发的核心技术,它让事务在不加锁的情况下实现“读不阻塞写,写不阻塞读”

事务实现:InnoDB的“幕后黑手”

事务的实现依赖三大核心技术:

组件作用关键机制
Undo Log事务回滚、MVCC记录修改前的旧值(物理记录)
Redo Log事务持久化、崩溃恢复记录修改后的操作(逻辑记录)
并发控制行锁、间隙锁、意向锁
📌 Undo Log 工作流程
  1. 事务开始:记录当前状态
  2. 修改数据:生成Undo Log(如balance=1000 → 500
  3. 提交:标记为可清理
  4. 回滚:用Undo Log恢复旧值

💡Undo Log 两种类型

  • INSERT:记录插入的行
  • UPDATE:记录修改前的旧值

具体的操作:

由前面学习了解的知识可知,首先客户端在进行事务操作时,会发起请求去操作我们的mysql服务器,在mysql服务器的innodb引擎当中,分为内存结构和磁盘结构,磁盘结构里面存放了很多的一些数据文件,内存结构当中也有很大一块区域叫Buffer Pool(缓冲池),在其中缓冲了我们很多数据的一个一个页的信息,接下来当客户端发起这次事务操作,这操作中包含了多条的update和delete语句,执行的流程如是:

首先操作缓冲区,在缓冲区当中查找有没有我们所更新的这一块数据页的索引等,如果没有,此时进行等待,后台线程会把数据从磁盘中读取出来,然后再缓存在缓冲区里面,那么接下来就读取到了该数据页,接下来就可以执行相应的更新或者删除的sql逻辑。此时操作完成之后,缓冲区中的数据发生了变更,但是磁盘中并没有。那么此时该数据页被称之为“脏页”。这个脏页我们需要通过一定的时间,后台线程才能把它刷新到磁盘当中。此时内存中和磁盘中的数据就保持一致了。

问题:数据并没有实时更新,假如在输入磁盘中数据出现了错误,此时事务也已经提交了,但是在写入磁盘中出现了错误。会造成很大的损失,数据更新的持久性也没有得到保障。此时redo log 作用出现:

我们操作的增删改的操作会被记录到 redo log 日志中,随后会刷新进磁盘当中。

📌 Redo Log 工作流程
  1. 事务修改内存中的页(变脏页)
  2. 生成Redo Log(记录操作:UPDATE accounts SET balance=500
  3. 同步刷盘:确保Redo Log在磁盘(innodb_flush_log_at_trx_commit=1
  4. 异步刷脏页到磁盘

为什么需要Redo Log?
如果直接刷脏页到磁盘,I/O 开销大;
用Redo Log先写入磁盘,再异步刷脏页,大幅提升写性能

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/1/29 20:01:54

打开软件提示找不到d3dx9_40.dll如何修复? 附免费下载方法

在使用电脑系统时经常会出现丢失找不到某些文件的情况&#xff0c;由于很多常用软件都是采用 Microsoft Visual Studio 编写的&#xff0c;所以这类软件的运行需要依赖微软Visual C运行库&#xff0c;比如像 QQ、迅雷、Adobe 软件等等&#xff0c;如果没有安装VC运行库或者安装…

作者头像 李华
网站建设 2026/1/20 0:10:32

西哲对儒家的主流解读

西方哲学对儒家思想的解读是一个复杂且多元的领域&#xff0c;不同流派和哲学家基于自身理论框架对儒家进行了各具特色的阐释。以下是一些主流的解读视角和代表性观点&#xff1a; 启蒙运动时期的理性化解读 代表人物&#xff1a;莱布尼茨、伏尔泰、沃尔夫 核心观点&#xff1a…

作者头像 李华
网站建设 2026/1/24 11:30:58

短视频缺音效?2026年免费音效素材网站推荐榜单 自媒体/影视后期/游戏

一、引言&#xff1a;免费音效素材需求激增&#xff0c;品质与版权成关键痛点据中国音像与数字出版协会2025年《数字音效素材行业发展报告》显示&#xff0c;国内自媒体创作、影视后期制作、游戏开发等领域对免费音效素材的年需求量达48亿次&#xff0c;较上年增长51%。但行业调…

作者头像 李华
网站建设 2026/1/21 10:35:02

django-flask基于python的高中信息技术在线学习网站的设计与实现

目录摘要关于博主开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;摘要 随着信息技术的快速发展&#xff0c;在线学习平台逐渐成为教育领域的重要组成部分。本研究基于Python语言&#xff0c…

作者头像 李华
网站建设 2026/1/30 14:08:46

12. CPU → GPU数据上传 + 渲染指令执行流程

1.CPU → GPU数据上传 渲染指令执行流程 2.绑定GPU显存中的VBO/IBO说明1.CPU → GPU数据上传 渲染指令执行流程 以渲染一个3D对象为例, 全流程如下1).CPU准备阶段a.CPU在内存中整理好顶点数据、索引数据、常量缓冲区参数(比如 MVP 矩阵)b.CPU确定本次渲染的渲染状态(深度测试…

作者头像 李华
网站建设 2026/1/20 3:37:04

AI应用架构师打造的AI驱动虚拟旅游,树立行业标杆

从0到1构建AI驱动的虚拟旅游应用:AI应用架构师的实战指南 摘要/引言 问题陈述 随着人们对旅游体验多样化需求的增长,传统的实体旅游受到时间、空间以及各种现实因素的限制。如何突破这些限制,为用户提供沉浸式、个性化且不受地理和时间约束的旅游体验,成为旅游行业亟待解…

作者头像 李华