事务的 ACID 是数据库事务正确执行的四个基本特性,用来保证数据在并发和故障场景下的可靠性。下面逐个说明,并补充一些常见考点。
1. A — Atomicity(原子性)
定义:事务是一个不可分割的工作单位,要么全部执行成功,要么全部失败回滚,不存在“做一半”的状态。
关键点:
- 通过 Undo Log(回滚日志) 实现。
- 如果事务中途失败(如宕机、约束冲突),数据库会利用 Undo Log 将数据恢复到事务开始前的状态。
- 对用户来说,事务只有两种结果:提交(Commit) 或 回滚(Rollback)。
例子:
转账操作:A 扣钱、B 加钱必须同时成功;如果 B 加钱失败,A 的扣钱也要撤销。
2. C — Consistency(一致性)
定义:事务执行前后,数据库都必须从一个一致状态变到另一个一致状态,不破坏业务规则和约束。
关键点:
- 一致性是 目标,原子性、隔离性、持久性是 手段。
- 依赖:主键、外键、唯一约束、Check 约束,以及应用层的业务规则。
- 即使系统崩溃,数据库也不会出现“逻辑错误”。
例子:
账户总额在转账前后应保持不变;库存不能为负数(在有约束的情况下)。
3. I — Isolation(隔离性)
定义:多个事务并发执行时,一个事务的操作不应被其他事务干扰,各事务之间要相互隔离。
关键点:
- 通过 锁机制 + MVCC(多版本并发控制) 实现。
- SQL 标准定义了四种隔离级别(从低到高):
- Read Uncommitted(读未提交):可能脏读。
- Read Committed(读已提交):避免脏读,可能不可重复读。
- Repeatable Read(可重复读):避免脏读、不可重复读,InnoDB 还能防幻读。
- Serializable(串行化):完全隔离,性能最低。
- MySQL InnoDB 默认是 Repeatable Read,并通过 Next-Key Lock 解决幻读问题。
例子:
事务 A 读取某行数据时,事务 B 正在修改这行,隔离性保证 A 不会看到中间不一致的状态。
4. D — Durability(持久性)
定义:一旦事务提交,其结果就是永久性的,即使系统崩溃也不会丢失。
关键点:
- 通过 Redo Log(重做日志) 实现。
- 事务提交时,先将修改写入 Redo Log(顺序写,快),再异步刷盘。
- 宕机重启后,数据库通过 Redo Log 恢复已提交但未落盘的数据。
例子:
转账成功后即使数据库立刻断电,重启后这笔转账记录依然存在。
四者关系总结
| 特性 | 作用 | 实现手段 |
|---|---|---|
| Atomicity(原子性) | 要么全做,要么全不做 | Undo Log |
| Consistency(一致性) | 数据逻辑始终正确 | AID + 约束 + 业务规则 |
| Isolation(隔离性) | 并发事务互不干扰 | 锁 + MVCC |
| Durability(持久性) | 提交后永不丢失 | Redo Log |
一句话概括:
原子性、隔离性、持久性共同保障一致性。
常见面试/考试延伸点
- Undo Log vs Redo Log:Undo 用于回滚和 MVCC 读旧版本,Redo 用于崩溃恢复。
- WAL(Write-Ahead Logging):先写日志,再改数据页,是 ACID 实现的核心思想。
- MySQL InnoDB 的 RR 为什么能防幻读?:Next-Key Lock(记录锁 + 间隙锁)。
- CAP 与 ACID 的区别:CAP 针对分布式系统(一致性、可用性、分区容忍性),ACID 针对数据库事务。