mysql是如何保证事务的ACID特性的

原子性

通过undo log来保证事务的原子性,undo日志记录了每次事务修改前的数据,也就是当前事务的上一个版本的数据,数据库表中的数据有两个隐藏字段,一个是事务ID,一个是这条数据的上一个版本,最后形成版本链。

undo log日志
回滚日志
保证了事务的原子性
实现了数据多版本
delete undo log用于回滚,提交即清理
update undo log用于回滚,实现快照读,不能随便删除
1622272523984-d451c727-c4c6-4922-a30f-6e1cf422e2d5.png
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:待落盘数据
1622272900151-6b40287a-1ba3-47ea-b489-009a5fe8dac2.png
体积小,记录页的修改,比写入页代价低
末尾追加,随机写变顺序写,发生改变的页不固定

redo log 当数据修改时,除了修改Buffer Pool中的数据,还会在redo log记录这次操作;当事务提交时,会调用fsync接口对redo log进行刷盘。如果MySQL宕机,重启时可以读取redo log中的数据,对数据库进行恢复。redo log采用的是WAL(Write-ahead logging,预写式日志),所有修改先写入日志,再更新到Buffer Pool,保证了数据不会因MySQL宕机而丢失,从而满足了持久性要求 。

隔离性

mvcc-多版本并发控制,借助undo log来实现
解决了读写冲突
隐藏列
1622273763967-9dcb8442-2812-426c-a350-1b8436cacee4.png

一致性

上述的三个特征保证了一致性