一 快照读
- 一致性读,也就是一致非锁定读,也可以称为快照读,其实就是普通的读取即普通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锁来实现的。
注意:本文归作者所有,未经作者允许,不得转载