RR 隔离级别下彻底解决幻读了吗?

幻读 指在同一个事务中,同一个查询语句,前后两次执行得到的结果集不同,如:第一次查询得到六条记录,第二次查询得到七条数据

结论:RR 隔离级别下只能最大程度的避免幻读现象的出现,但无法彻底解决幻读现象!!

MySQL 中有两种读:快照读和锁定读

快照读 -- 出现幻读的情况

1

update语句修改的是最新数据。在时刻 4,由于事务 A 修改了id = 3的记录,记录中trx_id由 200 变成 100,所以该记录对事务 A 可见

锁定读 -- 出现幻读的情况

2

select * from t是快照读,不会对记录加锁,通过 MVCC 控制;select * from t for update是当前读,读最新的数据,而且会对记录加 Next-Key Lock

建议:在开启事务后,立马执行select ... for update,对记录加 Next-Key Lock,可以最大程度避免幻读