MySQL不可重复读与幻读

本文解析了不可重复读和幻读的概念,指出它们的区别在于单记录修改和全表变化,并说明MySQL通过MVCC实现可重复读来避免幻读。讨论了这两种问题在select操作中的表现,以及面试中关于MySQL幻读误解的澄清。

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

一直把不可重复读与幻读没搞太明白,有天看到一个说法觉得挺有道理:
不可重复读:针对的是单条记录,另一个事务修改了本事务读的记录,再次读时,记录改变了。解决此问题需要行锁;
幻读:针对的是整个表,第一次读9条记录,第二次读变成8条或者10条。解决此问题需要表锁。MySQL应该用的MVCC控制。

个人理解:
读未提交的问题:脏读、不可重复读、幻读
读已提交的问题:不可重复读,幻读
可重复读的问题:幻读

既然问题都是读,那是不是只是针对select呢?

有个面试官问MySQL会不会有幻读,之前一直觉得会有,也试验过。但是他说不会有。那么是之前对幻读理解有问题?之前的理解,查询数据,发现没有主键为10的记录,插入一条主键为10的记录,报主键冲突,就是幻读。那这个到底是什么问题?

我觉得再有人问MySQL会不会发生幻读,应该从上面两种情况来说,先明确幻读的定义。如果只是读的记录不同为幻读,那MySQL的可重复读解决了此问题。但是如果也包括插入主键冲突的场景,那么MySQL并没有解决。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值