mysql是如何解决脏读、不可重复读、幻读?

刚开始写博客.. 写的太low。

  1、数据库的两种读,每种读读的数据版本不一样,所以也成为MVCC

    a) 快照读 

      select * from where xxx  这种形式的都是快照读。

      如果读取的行数据,没有被锁定,就会返回查询行;如果数据行被锁定就会直接返回数据行的历史版本(历史版本在undo 日志里面)

    b) 当前读

      update , insert ,delete ,select xx from xx for update ,  in share mode 都是当前读

      当前读会等待,不会返回数据的历史版本

  2、mvcc 的实现原理

    mvcc是基于read view、活跃事务列表 做的,以后的文章我会专门分析这块。

  3、mysql 是如何解决脏读的

    在 快照读下是用的mvcc 做的,当前读使用 行级锁做的

  4、mysql 是如何解不可重复读、幻读

    在 快照读下是用的mvcc 做的,当前读使用 next key locking 做的

  总结:有的书上在介绍隔离级别怎么实现的,有的只说mvcc , 有的只说锁,说的都不全面。

       应该从当前读和快照读的角度去分析。快照读是用的mvcc,当前读是基于锁。

猜你喜欢

转载自www.cnblogs.com/hansc-blog/p/9358524.html
今日推荐