关闭

快照读和当前读

瞎溜达 1年前 ⋅ 127 阅读

一 快照读

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

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

二 当前读

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

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


全部评论: 0

    我有话说: