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恢复数据

  • 释放锁

posted @ 2025-04-17 10:15  蒟蒻00  阅读(58)  评论(0)    收藏  举报