本文共 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/