• mysql 事务隔离级别详解


    事物的 隔离级别,说简单非常简单(新手也能说出 是个隔离级别 和 影响),说男也非常难。(很多 有几年编程 经验的程序员依旧搞不清楚)

    废话不多少 直接开始:

         事务的隔离级别 是用来描述 事务的读关系的,和写完全没有关系。所有数据库都不允许修改一个事务未提交的数据行。

    Read Uncommitted(读取未提交内容)

      描述的是。一个未提交的事务里面修改的数据,可以立即被另一个事务查询到(  脏读(Dirty Read)  )

      实验设计1: 吧数据库隔离级别改成Read Uncommitted ,  两个方法 一个循环 查询 出指定 行,每查一次睡一秒。另一个方法 修改这 一行的数据,但是不提交事务(睡 100 秒) 。  先调用查询方法,然后调用修改方法,

      结果:修改立即被查询方法查询到。我们读到了脏数据。

    Read Committed(读取提交内容)

        描述:只能读到已经提交的事务修改的数据,但是在 同一个事务的 2次查询中 ,可以读取到 另一个事务提交了的数据。

       实验式设计2: 吧数据库隔离级别改成Read Committed ,两个方法 一个循环 查询 出指定 行,每查一次睡一秒。另一个方法 修改这 一行的数据,并且提交事务 。  先调用查询方法,然后调用修改方法,

       结果: 用 实验1 验证 不能读到脏数据,用实验2 验证 2 修改可以被 感知。

      备注:实验2 可能会被缓存影响。如果没有发出多次查询sql ,那么就是缓存的影响了,需要关闭mybatis 的 缓存。

        springboot 关闭mybits 缓存的方法如下:

          

    mybatis:
      configuration:
        cache-enabled: false
        local-cache-scope: STATEMENT
    

      

         

    Repeatable Read(可重读)

      

     描述:Repeatable Read 是mysql 的 默认级别 。  一般的解释 它 可以 避免 不可重复读,但是不能 避免幻读,但是 mysql InnoDB和Falcon存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)机制解决了该问题

      也就是说 mysql 的这个级别已经不会出 幻读 了。关于幻读的解释:幻读 (Phantom Read)。简单的说,幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行。

      实验3:修改实验2 ,查询 改成查询一共有多少行,修改 方法改成查询方法;

      结果:  利用实验2证明不在出现 不可重复读,利用 实验3 证明 InnoDB 解决了幻读。 

      备注: InnoDB mysql 默认的 数据库引擎

    Serializable(可串行化)  不管读事务还是写事务都加了独占锁。只能一个事务结束以后,赢一个事务才能执行。

      这个最好认证,查询事务没有提交的时候写事务是不能执行的。

    怎么修改 mysql的  事务 隔离级别 和 查询 mysql的 隔离级别 在我的另一篇文章中:https://www.cnblogs.com/cxygg/p/9338555.html

  • 相关阅读:
    清北学堂(2019 5 3) part 6
    清北学堂(2019 5 2) part 5
    清北学堂(2019 5 1) part 4
    dijkstra
    清北学堂(2019 4 30 ) part 3
    2020/5/1
    2020/4/30
    2020/4/29
    HSV模型
    2020/4/28
  • 原文地址:https://www.cnblogs.com/cxygg/p/9339184.html
Copyright © 2020-2023  润新知