当前位置: 首页 > news >正文

MySQL是怎么保障ACID特性的

MySQL(尤其是InnoDB存储引擎)通过多种机制保障事务的ACID特性,以下是其核心实现原理:

一、原子性(Atomicity)

目标:事务中的操作要么全部成功,要么全部回滚。 实现机制Undo Log(回滚日志)

  • 写入时机:事务修改数据前,将旧版本数据记录到Undo Log。
  • 作用:
    • 事务回滚时,根据Undo Log逆向恢复数据。
    • 为MVCC提供多版本数据快照(Read View)。
  • 存储方式:Undo Log存储在共享表空间(默认)或独立的Undo Tablespaces中。

二、持久性(Durability)

目标:事务提交后,数据永久保存,即使系统崩溃也不丢失。 实现机制Redo Log(重做日志) + Double Write Buffer(双写缓冲)

1. Redo Log
  • 写入时机:事务修改数据时,先写Redo Log,再更新内存中的数据页(Write-Ahead Logging,WAL)。
  • 作用:崩溃恢复时,通过Redo Log重放未刷盘的修改。
  • 刷盘策略:
    • innodb_flush_log_at_trx_commit=1:每次事务提交时刷盘(严格持久化)。
    • innodb_flush_log_at_trx_commit=0/2:异步刷盘(性能优化,牺牲部分持久性)。
2. Double Write Buffer
  • 问题背景:InnoDB页大小(16KB)与文件系统块大小(通常4KB)不匹配,可能导致页写入不完整(部分写失效)。
  • 解决方式:
    • 数据页刷盘前,先写入Double Write Buffer(连续内存区域)。
    • 再将Double Write Buffer分两次写入磁盘(每次1MB),确保崩溃后可通过Buffer恢复完整页。

三、隔离性(Isolation)

目标:事务间的操作相互隔离,避免脏读、不可重复读、幻读。 实现机制MVCC(多版本并发控制) + 锁机制

1. MVCC
  • 核心原理:每行数据维护多个版本(通过Undo Log链实现),事务通过Read View判断可见性。
  • Read View结构:
    • trx_ids:当前活跃事务ID列表。
    • up_limit_id:最小活跃事务ID。
    • low_limit_id:下一个待分配事务ID。
  • 可见性规则:
    • 数据行的事务ID(DB_TRX_ID)需满足:
      • 若DB_TRX_ID < up_limit_id:可见(已提交)。
      • 若DB_TRX_ID ≥ low_limit_id:不可见(未来事务修改)。
      • 若DB_TRX_ID在trx_ids中:不可见(未提交)。
2. 锁机制
  • 锁类型:
    • 行级锁:记录锁(Record Lock)、间隙锁(Gap Lock)、临键锁(Next-Key Lock)。
    • 表级锁:意向共享锁(IS)、意向排他锁(IX)。
  • 隔离级别与锁的配合:
    • READ COMMITTED:仅加记录锁,允许幻读。
    • REPEATABLE READ(默认):通过临键锁(Next-Key Lock)锁住记录及间隙,防止幻读。
3. 不同隔离级别的实现差异
隔离级别脏读不可重复读幻读实现原理
READ UNCOMMITTED允许允许允许直接读取最新数据,无MVCC快照。
READ COMMITTED禁止允许允许每次读生成新Read View,仅看到已提交数据。
REPEATABLE READ禁止禁止禁止事务首次读生成Read View,后续复用;临键锁防止幻读。
SERIALIZABLE禁止禁止禁止所有读操作加共享锁,写操作加排他锁,完全串行化。

四、一致性(Consistency)

目标:事务执行后,数据库从一种有效状态转换到另一种有效状态。 实现方式

  1. 原子性、隔离性、持久性的共同保障:通过Undo Log、Redo Log、锁等机制确保数据逻辑正确。
  2. 约束检查:
    • 数据库级约束:主键、唯一索引、外键、CHECK约束。
    • 应用级约束:业务逻辑校验(如余额非负)。
  3. 日志协调:
    • Binlog(二进制日志):用于主从复制,通过两阶段提交(2PC)与Redo Log协调,保证主从数据一致。

五、崩溃恢复(Crash Recovery)

流程

  1. Redo Log重放:从最近的Checkpoint开始,重放所有已提交事务的Redo Log。
  2. Undo Log回滚:对未提交的事务(事务ID在活跃列表中),通过Undo Log回滚修改。
  3. Double Write恢复:若数据页损坏,从Double Write Buffer恢复完整页。

六、总结:ACID实现全景图

ACID特性核心机制关键组件
原子性事务回滚Undo Log
持久性崩溃恢复Redo Log + Double Write Buffer
隔离性并发控制MVCC + 锁(临键锁、间隙锁)
一致性约束与日志协同应用约束 + Binlog + 两阶段提交

示例场景:转账事务

  1. 原子性:
    • 事务开始,记录账户A余额到Undo Log。
    • 扣除账户A余额,记录账户B余额到Undo Log。
    • 若失败,通过Undo Log恢复原余额。
  2. 持久性:
    • 修改后的余额写入Redo Log并刷盘。
  3. 隔离性:
    • 使用临键锁锁定账户A和B的行,防止其他事务修改。
  4. 一致性:
    • 事务提交后,账户A+B的总金额保持不变。

通过上述机制,MySQL在保证高性能的同时,实现了严格的ACID特性,适用于金融、电商等高可靠场景。

相关文章:

  • Docker 容器基础技术:namespace
  • Python----计算机视觉处理(Opencv:直方图均衡化)
  • 本周安全速报(2025.3.18~3.24)
  • GeoServer与MapServer:两款常用的开源地理空间服务器
  • 通过 ECNWP 洋流、海浪可视化开发的方法和架构
  • 破局AI落地困局 亚信科技“四位一体手术刀“切开产业智能三重枷锁
  • 【嵌入式学习2】内存管理
  • Android Compose 框架的 ViewModel 委托深入剖析(二十)
  • 小试牛刀-Turbine数据分发
  • FPGA_YOLO(二)
  • Python Web 框架之 Flask
  • 全文通读:126页华为IPD集成产品开发与DFX实战【文末附可编辑PPT下载链接】
  • spring+k8s 功能说明
  • Android Compose 框架派生状态(derivedStateOf、rememberCoroutineScope)深入剖析(十五)
  • Qt进程间通信:QSharedMemory 使用详解
  • 2025年陕西省各市秦创原产业创新聚集区(机器人、羊乳、苹果)“四链”融合项目申报补贴要求和时间流程
  • 【STM32】第一个工程的创建
  • MySQL的数据文件
  • 自然语言处理|LoRA:让大模型微调更简单更高效
  • JS 应用WebPack 打包器第三方库 JQuery安装使用安全检测
  • 我的科学观|张峥:AI快速迭代,我们更需学会如何与科技共处
  • 下任美联储主席热门人选沃什:美联储犯下“系统性错误”,未能控制一代人以来最严重的通胀
  • 中国航天员乘组完成在轨交接,神十九乘组将于29日返回地球
  • 偷拍拷贝某轨道车技术信息后撰写论文发表,工程师被判一年有期徒刑
  • 秦洪看盘|短线热点降温,A股回落整固
  • 政治局会议:要提高中低收入群体收入,设立服务消费与养老再贷款