ACID是指数据库管理系统中,事务所应该具备的四个特性,原子性、一致性、隔离性、持久性。
原子性
原子性是指一个事务是一个不可分割的单元,其中的操作要么都成功,要么都失败,即一个sql执行过程中遇到错误,已执行的语句必须回滚,数据库回退到事务执行前的状态。
实现原理:undo log
MySQL中的日志有很多种,二进制日志、错误日志、慢查询日志等,此外InnoDB存储引擎还提供了redo log和undo log两种事务日志,redo log是用来保证事务的持久性,undo log是事务原子性和隔离性实现的基础。
实现原子性的关键是当事务回滚时会撤销所有已经执行成功的sql语句,InnoDB实现事务回滚靠的是undo log。当事务对数据库执行修改时,InnoDB会生成对应的undo log,当事务执行失败或执行rollback时,就可以根据undo log中的信息将数据库进行恢复到事务执行前的状态。
undo log是逻辑日志,记录的是sql执行的相关信息,当事务回滚的时候,InnoDB会根据undo log中的信息执行与之相反的操作。
一致性
一致性是指事务在开始之前和执行结束之后,数据库的完整性约束没有被破坏。
只有保证了数据库的原子性、隔离性和持久性才能保证数据库的一致性。
隔离性
隔离性是指多个事务并发操作时,各个事务之间互不影响。
持久性
持久性是指事务一旦提交,对数据库的改变是永久的。
实现原理:redo log
InnoDB作为MySQL的存储引擎,数据是存储在磁盘上的,为了解决每次读写磁盘IO效率低的问题,InnoDB提供了缓存(buffer pool),buffer pool包含了磁盘中部分数据页的映射,作为访问数据库的缓冲。当从数据库中读取数据时,会先从buffer pool中读取,如果buffer pool中没有,会从磁盘中读取后放入buffer pool中;当向数据库中写入数据时,会首先写入buffer pool中,buffer pool中修改的数据库会定期刷入到磁盘中。
buffer pool的使用提高了数据库的读写效率,也带来了问题。当MySQL宕机的时候,buffer pool中修改的数据无法刷入磁盘中,会导致数据丢失,无法保证事务的持久性。
redo log可以解决这个问题,当数据库修改时,redo log也会记录对应操作,当事务提交时,会调用fsync接口对redo log进行刷盘。当MySQL宕机时,在重启数据库后,可以通过redo log中的内容对数据库进行恢复。
|