ACID怎么实现的
原子性(Atomicity)的实现
实现机制:Undo Log(回滚日志)
- Undo Log记录:当事务对数据进行修改时,InnoDB 会先记录修改前的数据到 Undo Log
- 回滚操作:如果事务失败需要回滚,引擎会使用 Undo Log 将数据恢复到事务开始前的状态
- 多版本控制:Undo Log 也用于实现 MVCC,当其他事务需要读取数据时,可以提供历史版本
一致性(Consistency)的实现
一致性是 ACID 的最终目标,由其他三个特性共同保证:
- 应用层约束:通过主键、外键、唯一约束等保证数据完整性
- 业务规则检查:由应用代码在事务中执行必要的验证
- 数据库内部检查:如 InnoDB 的双写缓冲(doublewrite buffer)防止页损坏
隔离性(Isolation)的实现
主要机制:锁 + MVCC (多版本并发控制)
锁机制
- 行级锁:InnoDB 实现了行级锁(共享锁、排他锁)
- 间隙锁(Gap Lock):防止幻读问题
- 意向锁:提高锁检查效率
MVCC 实现
- 版本链:每行数据有隐藏的 DB_TRX_ID(事务ID)、DB_ROLL_PTR(回滚指针)字段
- ReadView:事务执行时生成,决定能看到哪些版本的数据
- 可见性规则:基于事务ID和ReadView判断数据版本是否可见
持久性(Durability)的实现
实现机制:Redo Log + 刷盘策略
- Redo Log:记录物理级别的页修改操作(循环写入,固定大小)
- 刷盘策略
各组件协同工作示例
事务开始:分配事务ID,创建ReadView
数据修改:
-
记录Undo Log(用于回滚和MVCC)
-
获取行锁
-
修改内存中的数据页
-
记录Redo Log(保证持久性)
事务提交:
-
Redo Log 刷盘(保证持久性)
-
释放锁
事务回滚:
-
使用Undo Log恢复数据
-
释放锁

浙公网安备 33010602011771号