当前位置:   article > 正文

「Mysql 事务 隔离级别」 读提交和可重复读的区别_读已提交与可重复读差别

读已提交与可重复读差别

一、前提

首先我们应该先明确 Mysql的四种隔离级别和四种对应的现象

  • 隔离级别:
    读未提交、读已提交、可重复读、串行化
  • 现象:
    脏读、丢失修改、不可重复读、幻读

二、先说结论

读提交和可重复读都是一种隔离级别,可重复读解决了读提交本身未解决的 关于同一事务多次读取同一记录不一致的问题

怎么解决的?

对比记忆:
在读提交中: 事务A第一次读取数据,事务B修改同一数据但并未提交,事务A第二次读取数据,此时事务A读取数据并没有变化,然后将事务B提交,事务A第三次读取数据,才能读到数据的修改。
在可重复读中: 事务A第一次读取数据,事务B修改同一数据但并未提交,事务A第二次读取数据,此时事务A读取到的数据仍是修改之前的结果,然后将事务B提交,事务A第三次读取数据,(区别来了!)此时事务A读取到的数据仍然没有变化。 就是说在事务A提交之前,即使事务B修改并提交了数据,事务A读取的结果也没有任何变化,所以才会可重复读

说白话:
读提交在事务A提交之前,可以读到事务B修改并提交的数据
可重复读隔离级别下,事务A提交之前,无论事务B怎么修改怎么提交,读到的都是一样的数据。除非事务A也提交了,才会读到事务B作出的更改。

三、讨论分析

在明确前提定义之后,我们开始讨论;(具体不明白定义的朋友,我会将定义贴到文末)

首先最低的隔离级别是读未提交 该级别的开销小,并发量高,但是会带来我们所说的脏读现象 ——也就是事务A可以读取到事务B未提交的数据,也就是脏数据。
那么我们为了解决脏读 这一现象,出现了下一隔离级别读已提交 ——只能读到事务B提交之后的数据,在提交之前所做的修改,事务A是读不到的(不可见的)。
所以,在我们只能读到提交的数据之后,便出现了第三种现象,即在事务A开启后多次读取同一数据,在多次读取中间,事务B对数据进行了修改然后提交,提交之后事务A再读,导致事务A结束之前多次读取的数据不同,所谓的不可重复读这个是现象)。
解决不可重复读这一现象,需要用到下一隔离级别 这个隔离级别叫做 可重复读。但是可重复读仍然会有遗留现象,即幻读——当事务A在读取某个范围内记录时,事务B在该范围内插入了新的记录。

最终,解决幻读就用到了串行化这一隔离级别,通过强制事务串行之行,避免幻读问题,他会在读取的每一行数据上加锁

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/239568
推荐阅读
相关标签