InnoDB ACID实现:数据库可靠性的核心秘密

这段内容出自 MySQL 官方文档第 17.2 节《InnoDB 与 ACID 模型》,深入解释了 InnoDB 是如何实现 ACID 特性 的。ACID 是数据库系统中最核心的设计原则,确保数据在各种异常情况下依然可靠、一致、安全

我们来逐部分解析并通俗理解:


🔷 什么是 ACID 模型?

ACID 是四个英文单词的首字母缩写,代表数据库事务必须满足的四个关键属性:

字母含义中文
AAtomicity原子性
CConsistency一致性
IIsolation隔离性
DDurability持久性

ACID 的目标:即使遇到软件崩溃、硬件故障、断电等意外情况,数据库中的数据也不会损坏,事务的结果是可预测且可靠的。


🔷 一、A:原子性(Atomicity)

“要么全做,要么全不做。”

📌 核心思想:

一个事务中的所有操作被视为一个不可分割的整体。如果其中任意一步失败,整个事务都会被回滚(rollback),就像什么都没发生过。

💡 InnoDB 如何实现原子性?

  • COMMIT:只有当你显式执行 COMMIT,事务中所有修改才会真正写入数据库。
  • ROLLBACK:如果中途出错或你主动执行 ROLLBACK,所有已做的更改都会撤销。
  • autocommit 设置
    • 默认开启(autocommit=1):每条 SQL 语句自动作为一个事务提交。
    • 关闭时(autocommit=0):你可以手动控制事务边界,进行多语句事务处理。

✅ 示例:

START TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE user_id = 1;
UPDATE accounts SET balance = balance + 100 WHERE user_id = 2;
-- 如果第二条失败,第一条也会被撤销
COMMIT;

🔍 内部机制:InnoDB 使用 undo log(回滚日志) 记录事务执行前的数据状态,用于回滚。


🔷 二、C:一致性(Consistency)

“数据库始终处于合法状态。”

📌 核心思想:

事务执行前后,数据库从一个一致的状态转移到另一个一致的状态。比如外键约束、唯一索引、数据类型规则都不能被破坏。

⚠️ 注意:

“一致性”不是由 InnoDB 单独保证的,而是 ACID 四者共同作用的结果

  • 原子性防止部分更新;
  • 隔离性防止并发干扰;
  • 持久性防止数据丢失;
  • 加上约束(如外键、CHECK)等,最终保证“一致性”。

💡 InnoDB 如何帮助实现一致性?

  • 双写缓冲区(Doublewrite Buffer)

    • 在将数据页写入磁盘前,先写入一个“双写缓冲区”。
    • 防止“部分写”(partial page write)问题:即写了一半的页在崩溃时导致数据损坏。
    • 写完整后再写入真正的表空间文件。
  • 崩溃恢复(Crash Recovery)

    • 启动时自动检查 redo log 和 undo log。
    • 提交了的事务重做(redo),未提交的事务回滚(undo),确保数据回到一致状态。

📚 举例:转账操作不能让钱“凭空消失”,也不能“多出来”,这就是一致性。


🔷 三、I:隔离性(Isolation)

“并发执行的事务互不干扰。”

📌 核心思想:

多个事务同时运行时,彼此之间的影响应尽可能小,避免出现脏读、不可重复读、幻读等问题。

💡 InnoDB 如何实现隔离性?

  • 事务隔离级别(Transaction Isolation Levels)
    MySQL 支持四种标准隔离级别,InnoDB 都支持:
隔离级别能防止的问题性能影响实现机制简述
READ UNCOMMITTED最高(但危险)不加锁,直接读最新数据,不管其他事务是否提交。
READ COMMITTED脏读较高使用 一致性非锁定读。在每个语句执行时,都会读取已提交的最新快照。避免了写阻塞读,但同一个事务内两次相同的查询可能结果不同(不可重复读)。
REPEATABLE READ(默认)脏读、不可重复读中等使用 一致性非锁定读。在事务开始时创建一致性视图,整个事务期间都基于这个视图读取。保证了可重复读。InnoDB 还通过 Next-Key Locking 机制避免了幻读。
SERIALIZABLE所有问题最低(完全串行)将所有普通的 SELECT 语句隐式转换为 SELECT … FOR SHARE(加共享锁),读写会相互阻塞,实现完全串行。
  • InnoDB 的默认隔离级别是 REPEATABLE READ,但它通过 MVCC(多版本并发控制) 实现了“快照读”,避免了大部分锁竞争。

  • 行级锁 + 间隙锁(Gap Lock)

    • 防止幻读(phantom reads)。
    • 锁定记录及其“间隙”,确保范围查询结果稳定。
  • 可通过以下方式监控锁状态

    SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX;        -- 当前事务
    SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;      -- 锁信息(MySQL 5.7 及以前)
    SELECT * FROM performance_schema.data_locks;        -- MySQL 8.0 推荐方式
    

🔷 四、D:持久性(Durability)

“一旦提交,数据就永久保存。”

📌 核心思想:

事务一旦提交,即使系统崩溃、断电,数据也不会丢失。

💡 持久性是 ACID 中最复杂的,因为它不仅依赖软件,还依赖硬件和系统配置

🔧 InnoDB 和 MySQL 如何实现持久性?

组件作用
innodb_flush_log_at_trx_commit控制 redo log 刷盘策略:
1:每次事务提交都刷盘(最安全,性能略低)
0:每秒刷一次(性能高,可能丢1秒数据)
2:提交时写日志但不刷盘(折中)
sync_binlog控制 binlog 刷盘频率:
1:每次事务都同步到磁盘(推荐用于主从复制)
双写缓冲区(Doublewrite Buffer)再次出现,防止页写入不完整导致数据损坏
innodb_file_per_table每个表独立文件,便于管理与恢复
存储设备的写缓存(Write Cache)如 SSD、RAID 卡的缓存,但断电会丢数据 → 需配合电池或电容
带电池的缓存(BBWC)RAID 卡带电池,断电时可将缓存数据写入磁盘
操作系统 fsync()确保数据真正写入物理磁盘,而非停留在 OS 缓存中
UPS(不间断电源)防止突然断电,给系统留出时间安全关闭
备份策略定期全量 + 增量备份,是持久性的最后一道防线

📌 持久性是“软硬结合”的结果
即使 InnoDB 写了日志,但如果硬盘缓存没电、UPS 没有、fsync 被绕过,数据仍可能丢失。


🔷 总结:ACID 的实现机制一览

ACID 属性InnoDB/MySQL 实现机制
A 原子性COMMIT / ROLLBACKautocommit、undo log
C 一致性崩溃恢复、双写缓冲、外键、约束、MVCC、事务机制共同保障
I 隔离性隔离级别、MVCC、行锁、间隙锁、临键锁
D 持久性redo log、innodb_flush_log_at_trx_commitsync_binlog、双写缓冲、硬件(UPS、BBWC)、备份

🔍 补充:ACID 的“权衡”(Trade-off)

文档中提到:

“在某些情况下,如果你有额外的软件保护、超可靠硬件,或者应用能容忍少量数据丢失,可以牺牲一些 ACID 可靠性来换取更高性能。”

📌 举例:

  • innodb_flush_log_at_trx_commit = 2:性能提升,但极端情况下可能丢失最近提交的事务。
  • 使用 READ COMMITTED 而非 REPEATABLE READ:减少锁争用,提高并发。
  • 关闭双写缓冲(不推荐):提升写性能,但增加数据损坏风险。

⚠️ 生产环境建议保持默认安全设置,除非你清楚后果并有其他补偿机制。


✅ 一句话总结:

InnoDB 通过 undo log、redo log、双写缓冲、MVCC、行锁、隔离级别等机制,结合操作系统和硬件支持,全面实现了 ACID 事务特性,确保了数据在高并发、异常情况下的可靠性、一致性和持久性。

理解 ACID 不仅是理解 InnoDB 的核心,更是理解现代关系型数据库如何“安全地处理数据”的基础。

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

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

相关文章

CoolUtils Total Excel Converter:全能的 Excel 文件转换工具

一、软件简介 CoolUtils Total Excel Converter 是一款功能强大的 Excel 文件转换工具,专为高效处理和转换 Excel 文件而设计。它支持将 Excel 文件(包括 XLS 和 XLSX 格式)转换为多种常见的文件格式,如 PDF、CSV、HTML、TXT 等&…

告别静态图谱!TextSSL如何用「稀疏学习」实现更智能的文档分类?

文章链接:https://mp.weixin.qq.com/s/danmd9lSQpmck4tVsM37bQ 今天分享一篇将图神经网络应用于文本分类的创新模型——TextSSL。在传统的文档理解中,模型往往难以同时捕捉文本的局部句法细节和全局语义关联。针对这一挑战,TextSSL提出了一种…

开源商城mall项目功能评估与优化建议

项目地址:https://github.com/macrozheng/mall 开源项目是大多数程序员用来练手的最好途径,但是技术面和技术深度同样重要。一个商城项目能够称之为商城不光有基础的商品后台管理、移动端、支付管理,要打造一个全链路的生态系统,…

我的页面开发

我的页面开发 后端data\me_page.js我的页面静态数据module.exports () > {return {superCard: {beanCount: 1555,tips: "下单得5倍吃货豆,兑专享红包",},cards: [{label: "常用功能",size: 30,items: [{iconUrl: "/imgs/me_page/coupang.png"…

Java Swagger2 能显示页面但看不到一个接口

反复检查之后,发现问题出在的代码如下: ApiModelProperty(value "材料链接地址", example "{ApiHost}/storage/test.pdf")private String url; 结论:example的值包括了 { 和 } ,导致网页解析的JSON数据失败…

2025年- H143-Lc344. 反转字符串(字符串)--Java版

1.题目2.思路 方法一&#xff1a;比如有5个元素 s[0],s[1],s[2],s[3],s[4] 反转之后对应 s[4],s[3],s[2],s[1],s[0] 所以s[0]s[4], s[1]s[3] s[i]s[n-1-i] 方法2:双指针 left0,rights.length-1; 当left<right的时候&#xff0c;交换两个元素的位置&#xff0c;左指针左移&am…

微服务高可用流程讲解

如何理解从前端nginx到后端微服务高可用架构问题&#xff0c;下面从nginx、gateway、nacos、各个服务节点的角度讲解下应该如何进行高可用&#xff0c;比如nginx是前端向后端进行的负载均衡&#xff0c;也相当于均衡地向各个gateway网关进行请求&#xff0c;再由gateway网关拉取…

留个档,Unity,Animation控制相机,出现抖动的问题记录

起因是项目用了一段高度自定义的过程复杂的相机Animation&#xff0c;来控制虚拟相机位移旋转。 发现在不同的电脑上&#xff0c;出现了不同程度的抖动。 搜索过程中&#xff0c;发现关键词&#xff1a;World Origin Rebasing。 Unity 世界坐标使用 float&#xff08;单精度浮点…

组合对冲策略(外汇版)

在复杂多变的外汇市场中&#xff0c;投资者常常面临着汇率波动带来的风险。为了降低这种风险&#xff0c;对冲策略成为了一种有效的风险管理工具。以下将详细介绍三种组合对冲策略&#xff0c;它们分别是基于多货币正负相关对冲、区域性货币对冲以及全日元货币对冲的策略。①多…

GPT-5-Codex 正式发布:迈向真正的“自主编程”时代

在 Anthropic Claude 近期遭遇争议的同时&#xff0c;OpenAI 推出了其编程领域的王牌产品——GPT-5-Codex。这并非简单的模型升级&#xff0c;而是基于 GPT-5 专为“自主编程”&#xff08;Autonomous Programming&#xff09;场景深度优化的专用版本&#xff0c;标志着 AI 编程…

java面试:了解redis的集群么,怎么通过redis的集群来实现redis的高可用?

我们知道&#xff0c;为了帮助数据库缓解高并发的压力&#xff0c;我们会上reids缓存帮助数据库分摊&#xff0c;虽说常见场景的并发量还不足以让redis宕机&#xff0c;但假设出现了极高的并发场景&#xff0c;redis依旧是有宕机的可能的&#xff0c;毕竟单点部署的redis容易出…

氧气科技亮相GDMS全球数字营销峰会,分享AI搜索时代GEO新观

2025年9月16日&#xff0c;全球数字营销领域的年度盛会——GDMS&#xff08;Global Digital Marketing Summit&#xff09;在上海国家会展中心盛大举行。作为品牌数字化转型的风向标&#xff0c;本届峰会汇聚来自全球的CEO、CMO、CDO及营销领域高管&#xff0c;共同探讨AI驱动下…

搭建Gin通用框架

Gin Web 开发脚手架技术文档 项目概述 本项目是一个基于 Gin 框架的 Go Web 开发脚手架模板&#xff0c;提供了完整的项目结构、配置管理、日志记录、MySQL 和 Redis 数据库连接等常用功能集成。 项目结构 gindemo/ ├── gindemo.exe # 编译后的可执行文件 ├── g…

windows 平台下 ffmpeg 硬件编解码环境查看

环境&#xff1a; 1&#xff0c;nvidia 显卡 2&#xff0c;驱动安装 powershell 下 执行如下命令&#xff0c;出现GPU信息 说明驱动安装正常。 nvidia-smi 3&#xff0c;安装支持 NVENC 的 FFmpeg &#xff08;1&#xff09;Windows 下 编译 FFmpeg 需要 CUDA Toolkit &am…

08_多层感知机

1. 单层感知机 1.1 感知机① 线性回归输出的是一个实数&#xff0c;感知机输出的是一个离散的类。1.2 训练感知机 ① 如果分类正确的话y<w,x>为正数&#xff0c;负号后变为一个负数&#xff0c;max后输出为0&#xff0c;则梯度不进行更新。 ② 如果分类错了&#xff0c;y…

安卓实现miniLzo压缩算法

LZO官方源码 http://www.oberhumer.com/opensource/lzo 找到miniLZO点击Dowload miniLZO下载源码 http://www.oberhumer.com/opensource/lzo/download/minilzo-2.10.tar.gz demo源码(包含安卓) https://github.com/xzw421771880/MiniLzo_Mobile.git 1.代码部分 1.1.测试…

如何在ubuntu下用pip安装aider,解决各种报错问题

aider中文文档网站上给出的安装说明比较简单&#xff1a; https://aider.doczh.com/docs/install.html 但是在一个干净的ubuntu环境中按文档中的命令安装时&#xff0c;会报错&#xff0c;经过一番尝试之后&#xff0c;解决了报错问题&#xff0c;成功完成了安装。 成功安装执…

Kotlin flow详解

流式数据处理基础 Kotlin Flow 是基于协程的流式数据处理 API&#xff0c;要深入理解 Flow&#xff0c;首先需要明确流的概念及其处理方式。 流(Stream)如同水流&#xff0c;是一种连续不断的数据序列&#xff0c;在编程中具有以下核心特征&#xff1a; 数据按顺序产生和消费支…

DeepSeek V3 深度解析:MoE、MLA 与 GRPO 的架构革新

简介 DeepSeek&#xff08;深度求索&#xff09;是一家源自中国的人工智能公司&#xff0c;成立于2023年&#xff0c;总部位于中国杭州。前身是国内量化投资巨头幻方量化的子公司。公司专注于开发低成本、高性能的AI模型&#xff0c;致力于通过技术创新推动人工智能技术的普惠…

Flask学习笔记(三)--URL构建与模板的使用

一、URL构建url_for()函数对于动态构建特定函数的URL非常有用。 该函数接受函数的名称作为第一个参数&#xff0c;并接受一个或多个关键字参数&#xff0c;每个参数对应于URL的变量部分。from flask import Flask, redirect, url_forapp Flask(__name__)app.route(/admin)def …