幻读和不可重复读区别_事务隔离级别中可重复读与幻读的恩恩怨怨

前言

中秋刚过,大家是不是还没充中秋的假日里缓过来?三天假期里,我深入窥探了Innodb中可重复读与幻读,非常有意思,分享给大家,作为大家工作前的开胃小菜,希望有所帮助.

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

4ca61efaf1caa00256c239801213b3ef.png

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

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

在这篇文章中,我将重点围绕MySQL中

可重复读(Repeatable read)能防住幻读吗?

这一问题展开讨论,相信看完这篇文章后,你一定会对事务隔离级别有新的认识.

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

4dd4a68644558c12c646547f683b932a.png

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

什么是幻读?

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

脏读

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

8b141652a251512b98ae16be5ef81445.png

在我们的例子中,事务2修改了一行,但是没有提交,事务1读了这个没有提交的数据。现在如果事务2回滚了刚才的修改或者做了另外的修改的话,事务1中查到的数据就是不正确的了,所以这条数据就是脏读。

不可重复读

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

b66dc62f22b47ad7bd5e725d985cc9b1.png

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

幻读

“幻读”又叫"幻象读

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值