在数据库世界里,ACID 是事务的“圣经”——它保证了数据的一致性和可靠性。
MySQL 的 InnoDB 引擎正是靠这四个特性,才能做到“断电不丢数据”、“并发不乱套”。
本文我们用最通俗的方式,讲清楚:
👉 ACID 是什么?
👉 InnoDB 是怎么实现它们的?
👉 每个机制背后的“黑科技”是什么?
一、ACID 是什么?
ACID 是数据库事务的四大特性:
| 特性 | 英文全称 | 解释 |
|---|---|---|
| A | Atomicity(原子性) | 要么全部执行,要么全部不执行 |
| C | Consistency(一致性) | 数据在事务前后必须合法一致 |
| I | Isolation(隔离性) | 多个事务互不干扰 |
| D | Durability(持久性) | 提交后的数据不会丢失 |
举个例子👇
假设你转账 100 元给朋友:
- 从你账户扣 100 元
- 给朋友账户加 100 元
这两个操作必须同时成功,否则账就乱了。
这就是事务的“原子性 + 一致性”的体现。
二、InnoDB 如何实现 A(原子性)
关键机制:Undo Log(回滚日志)
- 当事务修改数据时,InnoDB 会先把修改前的值记录到 Undo Log 中。
- 如果事务执行中途出错或被回滚,InnoDB 就根据 Undo Log 恢复数据到原来的状态。
举例:
UPDATE account SET balance = balance - 100 WHERE id = 1;
执行时,InnoDB 会:
- 把原余额(比如 1000)写进 Undo Log;
- 执行扣款;
- 如果出错,就从 Undo Log 恢复成 1000。
✅ Undo Log = 事务的“后悔药”。
三、InnoDB 如何实现 C(一致性)
一致性依赖其他三项特性共同实现:
- 原子性:保证事务完整执行;
- 隔离性:防止并发干扰;
- 持久性:防止数据丢失。
除此之外,数据库还有约束机制(如主键、外键、唯一约束等)来确保数据合法。
比如:
INSERT INTO user(id, email) VALUES (1, 'a@a.com');
如果 email 字段有唯一约束,再插入相同 email 会被拒绝,从而保持数据一致。
四、InnoDB 如何实现 I(隔离性)
关键机制:MVCC(多版本并发控制) + 锁机制
- MVCC(Multi-Version Concurrency Control):
每条数据在不同时间会有不同“版本”。
查询时,事务会读取自己能看到的版本,不会被其他事务的修改影响。 - 锁机制:
InnoDB 提供了行级锁(Row Lock)、间隙锁(Gap Lock)等,防止并发写入冲突。
事务隔离级别(由弱到强)
| 级别 | 能防止的问题 | 性能 |
|---|---|---|
| READ UNCOMMITTED | 无 | 🚀最快 |
| READ COMMITTED | 脏读 | ⚡快 |
| REPEATABLE READ(默认) | 脏读 + 不可重复读 | ⚖️平衡 |
| SERIALIZABLE | 所有并发问题 | 🐢最慢 |
✅ InnoDB 默认使用 REPEATABLE READ + MVCC,能兼顾性能与一致性。
五、InnoDB 如何实现 D(持久性)
关键机制:Redo Log(重做日志) + WAL(Write-Ahead Logging)
-
当事务提交时,InnoDB 不会立刻把数据写到磁盘的表文件,而是:
- 把修改记录写入 Redo Log(顺序写) ;
- 再异步刷到磁盘的数据页中。
Redo Log = 事务的“黑匣子”
👉 即使宕机重启,InnoDB 也能根据 Redo Log 重放操作,恢复未持久化的数据。
WAL 思想(写前日志) :
先写日志,再写数据,确保断电后也能恢复。
六、小结:四大日志体系一览
| 日志类型 | 作用 | 属于哪项特性 |
|---|---|---|
| Undo Log | 回滚事务 | 原子性 |
| Redo Log | 重做未落盘操作 | 持久性 |
| Binlog | 归档、主从复制 | 持久性(逻辑层) |
| 锁 & MVCC | 控制并发 | 隔离性 |
七、一句话总结
InnoDB 靠 Undo Log + Redo Log + MVCC + 锁机制,把 ACID 四大特性落实到了每一个事务里。
简单说:
- Undo 保证能回滚;
- Redo 保证不丢数据;
- MVCC 保证不打架;
- 约束保证一致。
本文由 dblens.com 知识分享,🚀 dblens for MySQL - AI大模型深度融合的一款免费的MySQL可视化GUI数据库连接管理软件。