一.四个隔离级别 二.可重复读导致的幻读(亲测) 三.MVCC(Mutil-Version Concurrency Control)
在可重复读的隔离级别下,select是不能够查出其他事务已经提交的新增记录事务,那难道可重复读解决了幻读的问题吗?当然没有,隔离级别中,只有串行化隔离级别才解决了幻读。
一.四个隔离级别
先重温一下事务的隔离级别吧
Read Uncommitted(读取未提交内容)
在此隔离级别,所有事务都可以看到其他未提交事务的执行结果。
例如:程序员发现自己工资卡入账8000¥,他很开心,这个月咋这么多。可是下一秒,老板发现工资发错了,等他算算具体多少¥再说,然后反手就把这笔8000流水回滚了。当程序员再去看余额想让自己开心一下的时候,发现这个时候卡里只剩下了个寂寞,晚上,伤心的猿站在天台,点了支烟,自己抽一半,风也抽一半。
Read Committed(读取提交内容)
这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)。它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。这种隔离级别 也支持所谓的不可重复读(Nonrepeatable Read),因为同一事务的其他实例在该实例处理其间可能会有新的commit,所以同一select可能返回不同结果。
例如:程序员又在看自己的余额,发现两次查看的余额不一样,余额的数字咋还变多了。原来老板突然发现忘了给他发去年年终,给他结工资的事务提交了以后,在程序员第二次看余额之前,又提交了一个补发去年年终奖的事务更新了他的余额。
Repeatable Read(可重读)
这是MySQL InnoDB引擎隔离级别默认为REPEATABLE-READ,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。不过理论上,这会导致另一个棘手的问题:幻读 (Phantom Read)。简单的说,幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行。
例如:有一天
MYSQL Innodb隔离级别与幻读现象解析

本文探讨了MySQL InnoDB的四个隔离级别,重点分析了在可重复读隔离级别下幻读的问题。虽然在某些情况下,可重复读级别的SELECT不会显示其他事务已提交的新增记录,但这并不意味着解决了幻读。通过MVCC(多版本并发控制)的一致性视图解释了为何在某些场景下会出现幻读,并指出只有串行化隔离级别才能彻底解决幻读问题。
最低0.47元/天 解锁文章
1220

被折叠的 条评论
为什么被折叠?



