mysql 事务隔离级别详解

时间:2021-10-23 06:23:22

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

废话不多少 直接开始:

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

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