首先在事务 T1 中:

    1. select * from teacher where number = 30;

    这个时候是找不到 number = 30 的记录的。
    我们在事务 T2 中,执行

    1. insert into teacher values(30,'Luffy','ELK');

    往表中插入了一条number = 30 的记录
    此时回到事务 T1,执行

    1. update teacher set domain='RabbitMQ' where number=30;
    2. select * from teacher where number = 30;

    REPEATABLE READ 隔离级别下,T1 第一次执行普通的 SELECT 语句时生成了一个 ReadView,之后 T2 向 teacher 表中新插入一条记录并提交。ReadView 并不能阻止 T1 执行 UPDATE 或者 DELETE 语句来改动这个新插入的记录(由于 T2 已经提交,因此改动该记录并不会造成阻塞),但是这样一来, 这条新记录的 trx_id 隐藏列的值就变成了 T1 的事务 id。之后 T1 再使用普通的SELECT 语句去查询这条记录时就可以看到这条记录了,也就可以把这条记录返回给客户端。因为这个特殊现象的存在,我们也可以认为 MVCC 并不能完全禁止幻读。