当前读
顾名思义,就是读取当前版本的数据。没错,其实它跟大名鼎鼎的 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。由于篇幅原因,这里不做介绍。