60面试常问:事务隔离级别中的可重复读能防幻读吗?(MySQL面试第二弹)

 

前言

每次谈到数据库的事务隔离级别,大家一定会看到这张表。

其中,可重复读这个隔离级别,有效地防止了脏读和不可重复读,但仍然可能发生幻读,可能发生幻读就表示可重复读这个隔离级别防不住幻读吗?

 

我不管从数据库方面的教科书还是一些网络教程上,经常看到RR级别是可以重复读的,但是无法解决幻读,只有可串行化(Serializable)才能解决幻读,这个说法是否正确呢?

 

在这篇文章中,我将重点围绕MySQL中可重复读(Repeatable read)能防住幻读吗?这一问题展开讨论,相信看完这篇文章后你一定会对事务隔离级别有新的认识。

 

我们的数据库中有如下结构和数据的Users表,下文中我们将对这张表进行操作

长文预警,读完此篇文章,大概需要您二十至三十分钟。

 

什么是幻读?

 

在说幻读之前,我们要先来了解脏读和不可重复读。

 

脏读

当一个事务读取到另外一个事务修改但未提交的数据时,就可能发生脏读。

 

 

在我们的例子中,事务2修改了一行,但是没有提交,事务1读了这个没有提交的数据。

 

现在如果事务2回滚了刚才的修改或者做了另外的修改的话,事务1中查到的数据就是不正确的了,所以这条数据就是脏读。

 

不可重复读

“不可重复读”现象发生在当执行SELECT 操作时没有获得读锁或者SELECT操作执行完后马上释放了读锁;另外一个事务对数据进行了更新,读到了不同的结果。

 

在这个例子中,事务2提交成功,因此他对id为1的行的修改就对其他事务可见了。导致了事务1在此前读的age=1,第二次读的age=2,两次结果不一致,这就是不可重复读。

 

幻读

“幻读”又叫"幻象读",是''不可重复读''的一种特殊场景:当事务1两次执行''SELECT ... WHERE''检索一定范围内数据的操作中间,事务2在这个表中创建了(如[[INSERT]])了一行新数据,这条新数据正好满足事务1的“WHERE”子句。

 

如图事务1执行了两遍同样的查询语句,第二遍比第一遍多出了一条数据,这就是幻读。

 

三者到底什么区别

 

三者的场景介绍完,但是一定仍然有很多同学搞不清楚,它们到底有什么区别,我总结一下。

 

脏读:指读到了其他事务未提交的数据。

不可重复读:读到了其他事务已提交的数据(update)。

不可重复读与幻读都是读到其他事务已提交的数据,但是它们针对点不同。<

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值