前言
中秋刚过,大家是不是还没充中秋的假日里缓过来?三天假期里,我深入窥探了Innodb中可重复读与幻读,非常有意思,分享给大家,作为大家工作前的开胃小菜,希望有所帮助.
每次谈到数据库的事务隔离级别,大家一定会看到这张表.
其中, 可重复读 这个隔离级别,有效地防止了脏读和不可重复读,但仍然可能发生幻读, 可能 发生幻读就表示 可重复读 这个隔离级别防不住幻读吗?
我不管从数据库方面的教科书还是一些网络教程上,经常看到RR级别是可以重复读的,但是无法解决幻读,只有可串行化(Serializable)才能解决幻读,这个说法是否正确呢?
在这篇文章中,我将重点围绕MySQL中
可重复读(Repeatable read)能防住幻读吗?
这一问题展开讨论,相信看完这篇文章后,你一定会对事务隔离级别有新的认识.
我们的数据库中有如下结构和数据的 Users 表,下文中我们将对这张表进行操作,
长文预警,读完此篇文章,大概需要您二十至三十分钟.
什么是幻读?
在说幻读之前,我们要先来了解脏读和不可重复读.
脏读
当一个事务读取到另外一个事务修改但未提交的数据时,就可能发生脏读。
在我们的例子中,事务2修改了一行,但是没有提交,事务1读了这个没有提交的数据。现在如果事务2回滚了刚才的修改或者做了另外的修改的话,事务1中查到的数据就是不正确的了,所以这条数据就是脏读。
不可重复读
“不可重复读”现象发生在当执行SELECT 操作时没有获得读锁或者SELECT操作执行完后马上释放了读锁; 另外一个事务对数据进行了更新,读到了不同的结果.
在这个例子中,事务2提交成功,因此他对id为1的行的修改就对其他事务可见了。导致了事务1在此前读的age=1,第二次读的age=2,两次结果不一致,这就是不可重复读.
幻读
“幻读”又叫"幻象读