面试官:你了解MySQL的四大特性吗?
李三:知道的,MySQL的四大特性即ACID。原子性、一致性、隔离性、持久性。
面试官:嗯,然后了?
李三: 原子性(atomicity)是指一个事务不可分割,要么全部提交成功,要么全部失败回滚; 一致性(consistency)是指一个事务能保证数据库从一个有效(正确)的状态“转移”到另一个有效(正确)的状态。 隔离性(isolation)指一个事务所做的修改在最终提交以前,对其他事务是不可见的。 持久性(durability)是指事务提交成功,所做的修改就一定会永久保存到数据库中。
面试官:那再详细谈谈四大特性是怎么实现?
李三:(幸好我今天看了这篇文章)哦哦哦,简单来说是这样的:
-
原子性是通过undo log日志保证的。
-
一致性一般是业务层进行逻辑判断实现的,比如限定余额不能为负。
-
隔离性是通过多版本并发控制机制实现的。
-
持久性是通过redo log日志保证的。
面试官:聊聊MySQL的三种日志?
在MySQL中,有三种日志。分别是redo log、binlog和undo log。
redo log 和 binlog
1、存储的内容
可以这样理解,binlog
记载的是update/delete/insert
这样的SQL语句,而redo log
记载的是物理修改的内容(xxxx页修改了xxx)。所以在搜索资料的时候也会有这样的说法:binlog
记录的是数据的逻辑变化,redo log
记录的是数据的物理变化
2、功能
redo log
的作用是实现持久化。数据库更新写完内存,如果数据库挂了,那我们可以通过redo log
来恢复内存还没来得及刷到磁盘的数据,将redo log
加载到内存里边,那内存就能恢复到挂掉之前的数据了。
binlog
的作用是进行复制和恢复。
-
主从服务器需要保持数据的一致性,通过
binlog
来同步数据。 -
如果整个数据库的数据都被删除了,
binlog
存储着所有的数据变更情况,那么可以通过binlog
来对数据进行恢复。
3、载体
redo log是InnoDB引擎特有的。binlog是MySQL的Server层实现的,所有引擎都可以使用。
4、记录方式
redo log是循环写的,空间固定会用完;binlog是追加写入的,一个文件写满后会切换到下一个文件而不会去覆盖以前的日志。
undo log
undo log
主要有两个作用:回滚和多版本并发控制(MVCC)
在数据修改的时候,不仅记录了redo log
,还记录undo log
,如果因为某些原因导致事务失败或回滚了,可以用undo log
进行回滚undo log
主要存储的也是逻辑日志,比如我们要insert
一条数据了,那undo log
会记录的一条对应的delete
日志。我们要update
一条记录时,它会记录一条对应相反的update记录。
回滚的实现就是找到undo log中对应的相反操作语句执行。 而多版本并发控制则是利用undo log做版本的回退(聊MVCCC时再具体讲)
那你再说说多版本并发控制吧
那接着聊聊redo log、binlog和undo log的更新过程?