面试官:什么是当前读和快照读?

2,523 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第 14 天,点击查看活动详情

哈喽,大家好,我是二毛。

记得我刚学 Mysql 的时候,只知道增删改查一把梭,后面工作后逐渐才知道当前读和快照读的相关概念。初学者刚接触的时候,可能会有点懵。那么这篇文章就带大家了解下什么是当前读和快照读。

当前读

顾名思义,就是读取当前版本的数据。没错,其实它跟大名鼎鼎的 MVCC 机制有联系,但是由于篇幅,这里不做过多介绍。

当前读包含的 SQL 语句如下:

  1. update , delete , insert
  2. select......for update
  3. select......lock in share mode

当前读, 对读取的记录加锁, 阻塞其他事务同时改动相同记录,避免出现安全问题。

那你有想过,为什么 Mysql 要对当前读的这些 SQL 加锁?这里有个例子:

假设要 update 一条记录,但另一个事务已经delete这条数据且commit了,如果不加锁就会产生冲突。所以update的时候肯定要是当前读,得到最新的信息并且锁定相应的记录。

当前读的实现方式是 next-key锁,即行记录锁+Gap间隙锁。至于到底是用记录锁,还是Gap间隙锁,得看索引命中情况,

快照读

同样顾名思义,就是读取快照的数据,这个快照一般指的是历史快照。

快照读包含的 SQL 语句为简单的 select 语句,就是不包含 ...for update, ...lock in share mode 关键字的。

因为查询不涉及数据的更新,一般查询只关注当前时机的历史快照数据,不像update那样更新数据是要最新版本才行。所以快照读能够在一定程度上提升 Mysql 的并发性能。

快照读的实现方式:undolog和MVCC。由于篇幅原因,这里不做介绍。

最后

今天介绍了 当前读和快照读的 概念原理相关,希望对大家有帮助~

我是二毛,我们下期再见~