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

原子性
通过undo log来保证事务的原子性,undo日志记录了每次事务修改前的数据,也就是当前事务的上一个版本的数据,数据库表中的数据有两个隐藏字段,一个是事务ID,一个是这条数据的上一个版本,最后形成一个版本链。
持久性
redo log实现持久性,redo log又叫重做日志,记录了当前事务的修改
隔离性
mvcc - 多版本并发控制,借助于undo log来实现
解决读写冲突
隐藏列
一致性
上述三个特性保证一致性

undo日志
回滚日志
保证事务的原子性
实现数据多版本
delete undo log用于回滚,提交即清理
update undo log用于回滚,同时实现快照读,不能随便删除
image.png

image.png

redo log
记录修改
用于异常恢复
循环写文件
write pos:写入位置
check point:刷盘位置
check point -> write pos:待落盘数据
image.png
体积小,记录页的修改,比写入页代价低
末尾追加,随机写变顺序写,发生改变的页不固定