持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第 14 天,点击查看活动详情
哈喽,大家好,我是二毛。
记得我刚学 Mysql 的时候,只知道增删改查一把梭,后面工作后逐渐才知道当前读和快照读的相关概念。初学者刚接触的时候,可能会有点懵。那么这篇文章就带大家了解下什么是当前读和快照读。
当前读
顾名思义,就是读取当前版本的数据。没错,其实它跟大名鼎鼎的 MVCC 机制有联系,但是由于篇幅,这里不做过多介绍。
当前读包含的 SQL 语句如下:
- update , delete , insert
- select......for update
- 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。由于篇幅原因,这里不做介绍。
最后
今天介绍了 当前读和快照读的 概念原理相关,希望对大家有帮助~
我是二毛,我们下期再见~