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