zoukankan      html  css  js  c++  java
  • MySQL事务隔离级别和MVCC

    原文:MySQL事务隔离级别和MVCC https://juejin.im/post/6844903808376504327#heading-6

    MVCC文章勘误:https://juejin.im/post/6844903815863336973

     

    自己整理的:

    脏读:在一个事务处理过程里读取了另一个未提交的事务中的数据。

    不可重复读:一个事务读取到了其他事务已经提交的数据,导致前后两次读取数据不一致的情况,称为不可重复读。

    幻读:一个事务前后两次读取数据不一致,是由于其他数据插入数据造成的,这种情况叫做幻读。

    所谓的MVCC(Multi-Version Concurrency Control ,多版本并发控制)指的就是在使用READ COMMITTDREPEATABLE READ这两种隔离级别的事务在执行普通的SEELCT操作时访问记录的版本链的过程,这样子可以使不同事务的读-写写-读操作并发执行,从而提升系统性能。
     
    READ COMMITTDREPEATABLE READ这两个隔离级别的一个很大不同就是生成ReadView的时机不同READ COMMITTD每一次进行普通SELECT操作前都会生成一个ReadView,而REPEATABLE READ只在第一次进行普通SELECT操作前生成一个ReadView,之后的查询操作都重复这个ReadView就好了。

    RR 和 RC 的区别:

    • RR 可避免 不可重复读,RC 可能 出现 不可重复读的情况
    • RR 隔离级别下,普通的select使用快照读(snapshor read),底层使用MVCC来实现;
      加锁的select(select..... in share mode/ select ... for update) 以及更新操作 update,delete等语句使用当前读(current read),底层使用记录锁、或者间隙锁临键锁
    • RC  隔离级别下,普通的select使用快照读,使用MVCC来实现;
      加锁的select都是用记录锁,因为没有间隙锁(Gap Lock)。除了两种特殊情况--外键约束检查以及重复键检查时会使用间隙锁封锁区间。

    mysql如何实现避免幻读

    • 快照读情况下,mysql通过mvcc来避免幻读。
    • 当前读情况下,mysql通过next-key来避免幻读

    什么是快照读和当前读

    • 快照读:简单的select操作,属于快照读,不加锁。

      • select * from table where 。。。;
    • 当前读:特殊的读操作,插入/更新/删除操作,属于当前读,需要加锁。

      • select * from table where ? lock in share mode;
      • select * from table where ? for update;
      • insert into table values (…);
      • update table set ? where ?;
      • delete from table where ?;
  • 相关阅读:
    网络请求与远程资源
    JavaScript对象
    微信小程序抓包Charles
    归并排序
    顺序表
    后缀表达式
    中缀表达
    ES6 Promise
    Es 方法
    10.26学习
  • 原文地址:https://www.cnblogs.com/dong320/p/13724497.html
Copyright © 2011-2022 走看看