mysql-innoDB存储引擎事务的原理

InnoDB 存储引擎支持 ACID 事务,其事务机制是通过 Redo Log(重做日志)Undo Log(回滚日志) 和 事务日志系统 来实现的。下面详细解析 InnoDB 事务的工作原理。

1.事务的基本特性(ACID)

特性描述
Atomicity(原子性)事务中的操作要么全部成功,要么全部失败回滚
Consistency(一致性)事务执行前后数据库的状态保持一致
Isolation(隔离性)多个事务并发执行时互不干扰
Durability(持久性)事务提交后对数据的修改是永久性的

2.InnoDB 事务的核心组件

1. Redo Log(重做日志)

  • 作用:确保事务的持久性(Durability)
  • 写入时机:在事务提交前写入
  • 记录内容:物理日志,记录页修改(如某个页中某偏移量位置的值被修改为多少)
  • 特点
    • 顺序写入,速度快
    • 用于崩溃恢复(crash recovery),防止数据丢失
示例:
START TRANSACTION;UPDATE users SET balance = balance - 100 WHERE id = 1;COMMIT;
  • 在 COMMIT 前会先将该操作写入 Redo Log。

2. Undo Log(回滚日志)

  • 作用:确保事务的原子性(Atomicity)MVCC(多版本并发控制)
  • 记录内容:逻辑日志,记录修改前的数据状态(如“将 id=1 的 balance 从 500 改为 400”)
  • 用途
    • 回滚未提交事务
    • 实现 MVCC,提供一致性读视图(consistent read view)

Undo Log 是事务可回滚的关键机制。

3. 事务日志缓冲区(Log Buffer)

  • 作用:临时缓存 Redo Log,在合适时机刷新到磁盘。
  • 相关参数

    innodb_log_buffer_size = 16M # 默认16MB,建议增大至64M~256M

3.事务的生命周期

一个完整的事务流程如下:

1. 开始事务(BEGIN 或 START TRANSACTION)

  • InnoDB 分配事务对象(TRX 对象)
  • 初始化 Undo Log 空间

2. 执行 SQL 操作(DML)

  • 修改 Buffer Pool 中的数据页
  • 写入 Undo Log(记录旧值)
  • 生成 Redo Log(记录页修改)

3. 提交事务(COMMIT)

  • 将 Redo Log 刷盘(默认行为,由 innodb_flush_log_at_trx_commit 控制)
  • 标记事务为已提交
  • 清理 Undo Log(根据是否被 MVCC 引用决定何时清理)

4. 回滚事务(ROLLBACK)

  • 使用 Undo Log 回退所有修改
  • 释放事务资源

4.事务控制参数

参数名默认值说明
innodb_flush_log_at_trx_commit1控制 Redo Log 刷盘策略
autocommitON自动提交开关
tx_isolationREPEATABLE-READ事务隔离级别

innodb_flush_log_at_trx_commit 可选值:

行为安全性性能
0每秒刷盘一次✅✅✅
1每次提交都刷盘(默认)✅✅✅
2每次提交写入 OS 缓冲,每秒刷盘✅✅✅✅

5.事务与锁的关系

InnoDB 使用行级锁来保证事务的隔离性,主要涉及以下几种锁:

锁类型描述
Record Lock锁定索引记录
Gap Lock锁定索引记录之间的间隙,防止幻读
Next-Key LockRecord Lock + Gap Lock,InnoDB 默认使用的锁机制

示例:

SELECT * FROM users WHERE age BETWEEN 10 AND 20 FOR UPDATE;

  • InnoDB 会对这个范围加 Next-Key Lock,防止其他事务插入新记录。

6.事务与 MVCC(多版本并发控制)

MVCC 是 InnoDB 实现高并发访问的核心机制之一,依赖于:

  • Undo Log:保存历史版本数据
  • Read View:每个事务看到的数据快照

在 REPEATABLE READ 隔离级别下,事务在整个生命周期内看到的是同一个 Read View。

7.事务的提交与崩溃恢复

如果 MySQL 在事务提交过程中宕机:

  1. Redo Log 已经写入磁盘 → 数据恢复时可以重放 Redo Log,恢复事务修改
  2. Redo Log 未写入 → 事务不会生效,数据保持原样

这是 InnoDB 实现持久性崩溃恢复能力的关键。

8.查看事务信息

你可以使用如下命令查看当前事务状态:

SHOW ENGINE INNODB STATUS\G

在输出的 TRANSACTIONS 部分可以看到:

  • 当前活跃事务
  • 事务等待的锁
  • Undo Log 使用情况等

9.总结表格

组件类型作用是否影响事务持久性是否影响事务原子性
Redo Log日志记录页修改,用于恢复
Undo Log日志记录旧值,用于回滚和 MVCC
Log Buffer内存缓存 Redo Log
锁系统并发控制控制并发事务访问

如果你希望深入分析某个具体事务的行为(比如查看其 Redo/Undo Log 内容),我也可以指导你如何使用调试工具或日志文件进行分析。

 

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

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

相关文章

在GIS 工作流中实现数据处理

通过将 ArcPy 应用于实际的 GIS 工作流,我们可以高效地完成数据处理任务,节省大量时间和精力。接下来,本文将结合具体案例,详细介绍如何运用 ArcPy 实现 GIS 数据处理的全流程。 数据读取与合并 假设我们有多个 shapefile 文件&a…

第十四届蓝桥杯_省赛B组(C).冶炼金属

题目如下: 拿到题我们来看一下,题目的意思,就是求出N个记录中的最大最小值,言外之意就是,如果超过了这个最大值不行,如果小于这个最小值也不行,所以我们得出,这道题是一个二分答案的题目&#x…

​​Android 如何查看CPU架构?2025年主流架构有哪些?​

在开发安卓应用或选购手机时,了解设备的CPU架构至关重要。不同的架构影响性能、兼容性和能效比。那么,​​如何查看安卓设备的CPU架构?2025年主流架构有哪些?不同架构之间有什么区别?​​ 本文将为你详细解答。 ​​1.…

飞算 JavaAI 2.0.0:开启老项目迭代维护新时代

在软件开发领域,老项目的迭代与维护一直是开发团队面临的难题。代码逻辑混乱、技术栈陈旧、开发效率低下等问题,让老项目改造犹如一场 “噩梦”。而飞算 JavaAI 2.0.0 版本的正式上线,通过三大核心能力升级,为老项目开发带来了全新…

Linux初步介绍

Linux是一种开源的类Unix操作系统内核,广泛应用于服务器、桌面、嵌入式设备等各种计算平台。它由Linus Torvalds于1991年首次开发,因其稳定性、安全性和灵活性,被全球开发者和企业广泛采用。 特点: 开放性(开源&#…

OneNet + openssl + MQTT

1.OneNet 使用的教程 1.在网络上搜索onenet,注册并且登录账号。 2.产品服务-----物联网服务平台立即体验 3.在底下找到立即体验进去 4.产品开发------创建产品 5.关键是选择MQTT,其他的内容自己填写 6.这里产品以及开发完成,接下来就是添加设…

行为设计模式之Memento(备忘录)

行为设计模式之Memento(备忘录) 前言: 备忘录设计模式,有点像vmware快照可以回滚,idea的提交记录同样可以混滚,流程引擎中流程可以撤销到或者回滚到某个指定的状态。 1)意图 在不破坏封装性的…

动画直播如何颠覆传统?解析足球篮球赛事的数据可视化革命

在5G和AI技术快速发展的今天,体育赛事直播正在经历一场深刻的变革。传统视频直播虽然能提供真实的比赛画面,但在战术可视化、数据深度和交互体验方面存在明显短板。而基于实时数据驱动的动画直播技术,正通过创新的方式弥补这些不足&#xff0…

二刷苍穹外卖 day01

nginx nginx反向代理 将前端发送的请求由nginx转发到后端服务器 好处: 提速:nginx本身可缓存数据 负载均衡:配置多台服务器,大量请求来临可均衡分配 保证后端安全:不暴露后端服务真实地址 server{listen 80;server_…

5.2 HarmonyOS NEXT应用性能诊断与优化:工具链、启动速度与功耗管理实战

HarmonyOS NEXT应用性能诊断与优化:工具链、启动速度与功耗管理实战 在HarmonyOS NEXT的全场景生态中,应用性能直接影响用户体验。通过专业的性能分析工具链、针对性的启动速度优化,以及精细化的功耗管理,开发者能够构建"秒…

模型训练-关于token【低概率token, 高熵token】

Qwen团队新发现:大模型推理能力的提高仅由少数高熵 Token 贡献 不要让低概率token主导了LLM的强化学习过程 一 低概率词元问题 论文:Do Not Let Low-Probability Tokens Over-Dominate in RL for LLMs 在RL训练过程中,低概率词元&#xff08…

XCTF-web-easyupload

试了试php,php7,pht,phtml等,都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接,得到flag

gRPC、WebSocket 与 HTTP 的核心区别对比

gRPC、WebSocket 与 HTTP 的核心区别对比,涵盖通信模式、协议特性及适用场景: 🔄 ‌一、通信模式‌ ‌HTTP‌ ‌单向请求-响应‌:客户端发起请求,服务器返回响应后连接立即关闭13。‌无状态协议‌:每次请求…

Android第十三次面试总结(四大 组件基础)

Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: ​onCreate()​​ ​调用时机​:Activity 首次创建时调用。​…

讲讲JVM的垃圾回收机制

垃圾回收就是对内存堆中已经死亡或者长时间没有使用的对象进行清楚或回收。 JVM 在做 GC 之前,会先搞清楚什么是垃圾,什么不是垃圾,通常会通过可达性分析算法来判断对象是否存活。 在确定了那些垃圾可以被回收后,垃圾回收器&…

QT软件外包开发费用

国内QT软件外包开发费用是一个非常复杂的问题,没有一个固定的价格,它受到多种因素的影响。以下将详细阐述影响QT软件外包开发费用的主要因素,并提供大致的价格区间供参考(请注意,这些价格仅为估算,实际报价…

iOS 16 SwiftUI 优雅跳转实践:用枚举路由和 NavigationStack 实现多页面导航

引言:跳转的混乱与优雅的必要性 SwiftUI 给我们带来了声明式界面的全新开发体验,但当涉及到页面跳转时,许多开发者仍然面临一些“旧痛”。最初的 NavigationLink(destination:isActive:) 或 sheet(isPresented:) 等方式虽然能用,…

TikTok矩阵养号实战:住宅IP纯净度与设备指纹联动方案

在TikTok矩阵运营中,住宅IP纯净度和设备指纹管理是规避风控的核心。以下方案整合多平台风控逻辑与实战数据,覆盖环境隔离、行为模拟到风险防控全流程。 🔧 一、住宅IP纯净度维持策略 IP筛选与验证 静态住宅IP优选:核心账号绑定目标…

Elasticsearch增删改查语句

创建索引库:不带映射的 PUT /索引名称 {"settings": {"number_of_shards": 3, // 主分片数"number_of_replicas": 1 // 每个主分片的副本数} } 创建带映射的索引库: PUT /products {"settings": {"…

树莓派4B, ubuntu20.04, 安装Ros Noetic[踩坑记录]

一、安装过程 1. 硬件要求 树莓派4B (建议4GB或8GB内存版本) 至少16GB的microSD卡 2. 下载并安装Ubuntu 20.04 Ubuntu 20.04 LTS (Focal Fossa) for Raspberry Pi 使用Raspberry Pi Imager或BalenaEtcher将镜像写入microSD卡 3. 安装ROS Noetic ​# 设置sources.list s…