快照读和当前读

一 一致性读

  1. 一致性读,也就是一致非锁定读,也可以称为快照读,其实就是普通的读取即普通 SELECT 语句。其中普通的 SELECT 操作不包括 select ... lock in share mode,select ... for update。
  2. 所谓的快照读是指,在执行 SELECT 语句的时候,会生成一个快照。
  3. 对于可重复读隔离级别,快照会在事务中第一次 SELECT 语句执行时生成,只有在本事务中对有数据变更才会更新快照。因此,第一次 SELECT 之前已提交事务的变更你可以看到;如果已执行了 SELECT,那么其它事务数据,你SELECT是看不到的。
  4. 对于读提交隔离级别,每次读取都会重新生成一个快照,读取只承认在语句启动前就已经提交完成的数据。

     可重复读隔离级别下,一致性读是通过 MVCC 和 undo log 来实现的。

二 当前读

  1. 更新数据都是先读后写的,而这个读,只能读当前的值,称为“当前读”(current read)。 
  2. select ... lock in share mode、select ... for update、insert、update、delete 都是当前读。
  3. 以 update 为例,假设一个事务 A 修改了数据,如果不是当前读,事务 B 对同一行记录的变更会导致事务 A 的变更。
  4. 事务 A 修改一行记录的时候会添加 next-key 锁,事务 B 需要等待事务 A 释放 next-key 锁。

     当前读是通过对行记录添加 next-key 锁来实现的。

三 参考文档

      https://dev.mysql.com/doc/refman/5.7/en/innodb-consistent-read.html

      https://dev.mysql.com/doc/refman/5.7/en/innodb-locking-reads.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章