T1 insert了一条数据,T2此时看不到,等T1 commit了以后,T2还是看不到。等T2事务进行提交了以后,在进行select,发觉,卧槽,数据怎么多了一条出来,感觉出现了幻觉,即“幻读”;
MVCC机制:多版本并发控制(Multiversion Concurrency Control)。MySQL默认隔离级别为Repeatable Read(可重读)。那么MySQL如何解决幻读的。
就是利用MVCC机制。
什么是多版本并发控制呢 ?其实就是在每一行记录的后面增加两个隐藏列,记录创建版本号和删除版本号,而每一个事务在启动的时候,都有一个唯一的递增的版本号。
只有read-committed和 repeatable-read 两种事务隔离级别才能使用MVCC
read-uncommited由于是读到未提交的,所以不存在版本的问题
而serializable 则会对所有读取的行加锁。