你真的了解MySQL的四大特性吗?

面试官:你了解MySQL的四大特性吗?

你真的了解MySQL的四大特性吗?

李三:知道的,MySQL的四大特性即ACID。原子性、一致性、隔离性、持久性。

面试官:嗯,然后了?

李三: 原子性(atomicity)是指一个事务不可分割,要么全部提交成功,要么全部失败回滚; 一致性(consistency)是指一个事务能保证数据库从一个有效(正确)的状态“转移”到另一个有效(正确)的状态。 隔离性(isolation)指一个事务所做的修改在最终提交以前,对其他事务是不可见的。 持久性(durability)是指事务提交成功,所做的修改就一定会永久保存到数据库中。

 

面试官:那再详细谈谈四大特性是怎么实现?

你真的了解MySQL的四大特性吗?

李三:(幸好我今天看了这篇文章)哦哦哦,简单来说是这样的:

  • 原子性是通过undo log日志保证的。

  • 一致性一般是业务层进行逻辑判断实现的,比如限定余额不能为负。

  • 隔离性是通过多版本并发控制机制实现的。

  • 持久性是通过redo log日志保证的。

 

面试官:聊聊MySQL的三种日志?

你真的了解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时再具体讲)

那你再说说多版本并发控制吧

你真的了解MySQL的四大特性吗?

那接着聊聊redo log、binlog和undo log的更新过程?

你真的了解MySQL的四大特性吗?