mysql是如何保证事务的ACID特性的
原子性
通过undo log来保证事务的原子性,undo日志记录了每次事务修改前的数据,也就是当前事务的上一个版本的数据,数据库表中的数据有两个隐藏字段,一个是事务ID,一个是这条数据的上一个版本,最后形成版本链。
undo log日志
回滚日志
保证了事务的原子性
实现了数据多版本
delete undo log用于回滚,提交即清理
update undo log用于回滚,实现快照读,不能随便删除
undo log是实现原子性的关键,是当事务回滚时能够撤销所有已经成功执行sql语句。innodb实现回滚靠的是undo log:当事务对数据库进行修改时,innodb会生成对应的undo log;如果事务执行失败或者调用了rollback,导致事务需要回滚,便可以利用undo log中的信息将数据回滚到修改之前的样子。(要么全部成功,要么全部失败)
持久性
redo log实现持久性redo log又叫重做日志,记录了当前事务的修改
redo log
记录修改
用于异常恢复
循环写文件
write pos:写入位置
check point:刷盘位置
check point->write pos:待落盘数据
体积小,记录页的修改,比写入页代价低
末尾追加,随机写变顺序写,发生改变的页不固定
redo log 当数据修改时,除了修改Buffer Pool中的数据,还会在redo log记录这次操作;当事务提交时,会调用fsync接口对redo log进行刷盘。如果MySQL宕机,重启时可以读取redo log中的数据,对数据库进行恢复。redo log采用的是WAL(Write-ahead logging,预写式日志),所有修改先写入日志,再更新到Buffer Pool,保证了数据不会因MySQL宕机而丢失,从而满足了持久性要求 。
隔离性
mvcc-多版本并发控制,借助undo log来实现
解决了读写冲突
隐藏列
一致性
上述的三个特征保证了一致性
