一直把不可重复读与幻读没搞太明白,有天看到一个说法觉得挺有道理:
不可重复读:针对的是单条记录,另一个事务修改了本事务读的记录,再次读时,记录改变了。解决此问题需要行锁;
幻读:针对的是整个表,第一次读9条记录,第二次读变成8条或者10条。解决此问题需要表锁。MySQL应该用的MVCC控制。
个人理解:
读未提交的问题:脏读、不可重复读、幻读
读已提交的问题:不可重复读,幻读
可重复读的问题:幻读
既然问题都是读,那是不是只是针对select呢?
有个面试官问MySQL会不会有幻读,之前一直觉得会有,也试验过。但是他说不会有。那么是之前对幻读理解有问题?之前的理解,查询数据,发现没有主键为10的记录,插入一条主键为10的记录,报主键冲突,就是幻读。那这个到底是什么问题?
我觉得再有人问MySQL会不会发生幻读,应该从上面两种情况来说,先明确幻读的定义。如果只是读的记录不同为幻读,那MySQL的可重复读解决了此问题。但是如果也包括插入主键冲突的场景,那么MySQL并没有解决。