MYSQL Innodb隔离级别:可重复读 为什么并未解决幻读

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.四个隔离级别                               二.可重复读导致的幻读(亲测)                  三.MVCC(Mutil-Version Concurrency Control)


在可重复读的隔离级别下,select是不能够查出其他事务已经提交的新增记录事务,那难道可重复读解决了幻读的问题吗?当然没有,隔离级别中,只有串行化隔离级别才解决了幻读。

一.四个隔离级别

先重温一下事务的隔离级别吧

Read Uncommitted(读取未提交内容)

在此隔离级别,所有事务都可以看到其他未提交事务的执行结果。

例如:程序员发现自己工资卡入账8000¥,他很开心,这个月咋这么多。可是下一秒,老板发现工资发错了,等他算算具体多少¥再说,然后反手就把这笔8000流水回滚了。当程序员再去看余额想让自己开心一下的时候,发现这个时候卡里只剩下了个寂寞,晚上,伤心的猿站在天台,点了支烟,自己抽一半,风也抽一半。

Read Committed(读取提交内容)

这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)。它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。这种隔离级别 也支持所谓的不可重复读(Nonrepeatable Read),因为同一事务的其他实例在该实例处理其间可能会有新的commit,所以同一select可能返回不同结果。

例如:程序员又在看自己的余额,发现两次查看的余额不一样,余额的数字咋还变多了。原来老板突然发现忘了给他发去年年终,给他结工资的事务提交了以后,在程序员第二次看余额之前,又提交了一个补发去年年终奖的事务更新了他的余额。

评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值