博客
关于我
MySQL如何实现ACID ?
阅读量:789 次
发布时间:2023-02-12

本文共 1093 字,大约阅读时间需要 3 分钟。

MySQL InnoDB ACID 实现原理

MySQL 作为一个关系型数据库,以其最常见的 InnoDB 引擎为例,如何保证 ACID?本文将深入探讨其实现方式。

ACID 原子性、一致性、隔离性和持久性

ACID 是数据库事务的核心概念,确保事务的可靠性。具体来说:

  • 原子性:事务是最小的执行单位,不允许分割。要么全部成功,要么全部失败。
  • 一致性:事务执行前后,数据保持一致。
  • 隔离性:并发访问时,一个事务不受其他事务影响。
  • 持久性:提交后的数据改变持久,不受数据库故障影响。

隔离性:四种隔离级别

隔离性通过锁和 MVCC 实现。四种隔离级别分别是:

  • 读未提交:事务未提交时,其他事务可见修改。
  • 读提交:事务提交后,其他事务才能看到修改。
  • 可重复读(RR):默认级别,确保事务中的数据一致性,无论其他事务是否提交。
  • 串行化:最高隔离级别,确保完全不受干扰,但并发性受限。
  • 隔离级别与问题

    不同隔离级别解决不同问题:

    • 脏读:未提交时可读。
    • 不可重复读:插入、更新时可能重复读到相同数据。
    • 幻读:插入数据后,其他事务可读到幻影行。

    锁与MVCC

    隔离性主要通过锁和 MVCC 实现:

    • :确保写入时互斥,但读时可共享。InnoDB 支持行锁,通过索引项加锁实现。
    • MVCC:多版本并发控制,解决幻读问题。

    MVCC 实现

    InnoDB 行记录包含版本号和回滚指针:

    • DATA_TRX_ID:数据行版本号。
    • DATA_ROLL_PTR:指向回滚段。

    undo log 记录事务前的状态,支持事务回滚。

    读视图与幻读解决

    每次查询创建读视图,判断数据版本,解决幻读。

    原子性与undo log

    undo log 记录事务操作,回滚时撤销修改。每个操作(insert、update、delete)都有对应操作。

    持久性与redo log

    持久性依赖 redo log:

    • WAL 技术:先写日志,再更新内存。
    • 两阶段提交:确保日志写入磁盘后,事务提交。

    Buffer Pool

    缓存机制,提升读写效率,但需定期刷脏页到磁盘。

    Binlog 与 Redo log

    二者区别:

    • Redo log 记录物理修改,循环写。
    • Binlog 记录逻辑语句,追加写入。

    事务提交流程

    写入时先写 redo log,再写 binlog,最后提交。

    为什么先写 redo log?

    避免事务丢失,保证持久性。

    一致性

    一致性是数据库目标,依赖应用逻辑和 ACID 保证。

    总结

    MySQL InnoDB 通过锁和 MVCC 实现 ACID,确保事务的可靠性。理解其内存结构和日志机制,能够更好地掌握数据库管理。

    转载地址:http://tebfk.baihongyu.com/

    你可能感兴趣的文章
    Mysql学习总结(6)——MySql之ALTER命令用法详细解读
    查看>>
    Mysql学习总结(70)——MySQL 优化实施方案
    查看>>
    Mysql学习总结(71)——MySQL 重复记录查询与删除总结
    查看>>
    Mysql学习总结(71)——数据库介绍(MySQL安装 体系结构、基本管理)再回顾
    查看>>
    Mysql学习总结(72)——MySQL 开发者开发,设计规范再总结
    查看>>
    Mysql学习总结(73)——MySQL 查询A表存在B表不存在的数据SQL总结
    查看>>
    Mysql学习总结(74)——慢SQL!压垮团队的最后一根稻草!
    查看>>
    Mysql学习总结(75)——并发量大、数据量大的互联网业务数据库设计军规
    查看>>
    Mysql学习总结(76)——MySQL执行计划(explain)结果含义总结
    查看>>
    Mysql学习总结(77)——温故Mysql数据库开发核心原则与规范
    查看>>
    Mysql学习总结(78)——MySQL各版本差异整理
    查看>>
    Mysql学习总结(79)——MySQL常用函数总结
    查看>>
    Mysql学习总结(7)——MySql索引原理与使用大全
    查看>>
    Mysql学习总结(80)——统计数据库的总记录数和库中各个表的数据量
    查看>>
    Mysql学习总结(81)——为什么MySQL不推荐使用uuid或者雪花id作为主键?
    查看>>
    Mysql学习总结(82)——MySQL逻辑删除与数据库唯一性约束如何解决?
    查看>>
    Mysql学习总结(83)——常用的几种分布式锁:ZK分布式锁、Redis分布式锁、数据库分布式锁、基于JDK的分布式锁方案对比总结
    查看>>
    Mysql学习总结(84)—— Mysql的主从复制延迟问题总结
    查看>>
    Mysql学习总结(85)——开发人员最应该明白的数据库设计原则
    查看>>
    Mysql学习总结(8)——MySql基本查询、连接查询、子查询、正则表达查询讲解
    查看>>