一篇了解全MVCC( 三 )

  • 继续判断4是否大于等于low_limit_id(5),通过比较发现也不大于,所以不符合条件
  • 判断事务4是否处理trx_list列表中,发现不在列表中,那么符合可见性条件
  • 所以事务4修改后提交的最新结果对事务2的快照是可见的,因此事务2读取到的最新数据记录是事务4所提交的版本,而事务4提交的版本也是全局角度的最新版本 。
    五、拓展1、当前读读取的是最新版本的记录,读取时还要保证其它并发事务不能修改当前记录,会对读取的记录进行加锁
    • 共享锁:select lock in share mode
    • 排它锁:select for update 、update、 insert 、delete
    2、快照/普通读1)概念像不加锁的select操作,就是快照读,即非阻塞读
    2)为什么会出现快照读?【一篇了解全MVCC】是基于提高并发性能的考虑,快照读是基于多版本并发控制,即MVCC,可以认为MVCC是行锁的一个变种,但它在很多情况下,避免了加锁操作,降低了开销;
    3)存在问题
    • 基于多版本,读到的并不一定是数据的最新版本,可能是之前的历史版本
    • 串行级别下的快照读会退化成当前读
    3、RC、RR级别下的InnoDB快照读有什么不同因为Read View生成时机的不同,从而造成RC、RR级别下快照读的结果的不同
    • 在RC级别下,事务中,每次快照读都会新生成一个快照和Read View,这就是我们在RC级别下的事务中可以看到别的事务提交的更新的原因
    • 在RR级别下,某个事务的对某条记录的第一次快照读会创建一个快照(Read View),将当前系统活跃的其他事务记录起来,此后在调用快照读的时候,还是使用的是同一个Read View,所以只要当前事务在其他事务提交更新之前使用过快照读,那么之后的快照读使用的都是同一个Read View,之后的修改对其不可见
    ?总结:在RC隔离级别下,是每个快照读都会生成并获取最新的Read View,而在RR隔离级别下,则是同一个事务中的第一个快照读才会创建Read View,之后的快照读获取的都是同一个Read View.
    4、 RR级别下怎么避免幻读
    • 快照读,和避免不可重复读原理一样,可以避免幻读
    • 当前读,因为每次都是读取新的快照,如果需要避免,可以通过加锁限制新增或删除相同条件的数据

    经验总结扩展阅读