【MySQL】可重复读级别为什么不能完全解决幻读问题?

可重复读级别为什么不能完全解决幻读问题?

众所周知,可重复读级别,通过 MVCC + undolog + 行隐藏字段 roll_pointer 和 trx 以及 readview 的四个隐藏字段 creator_trx_id、m_ids、 min_trx_id、max_trx_id 去解决快照读情况下的幻读问题
通过 锁机制,主要指临建锁,可分为记录锁+间隙锁 去保证当前读的幻读问题

但是呢,就算如此还有两种情况会出现幻读,虽然可能比较少见,但个人认为,当并发特别大的时候发生的概率也不小

1、事务 A 读取记录 3 条,事务 B 插入了其中一条 id=7,使得符合条件的多了一条,变为了四条,这时候事务 A 更新了 id=7,然后普通 select 读,就会发现出现幻读了(情况很违和,但有可能发生)
因为 update 会改变版本链

2、事务 A 读取记录 3 条,事务 B 插入了其中一条,使得符合条件的多了一条,此时事务 A 用了当前读,select…for update 会发现出现了幻读

解决方法:开启事务后立马执行 select…for update 因为它会加next-key lock,从而避免其他事务加入一条记录

你可能感兴趣的:(数据库,数据库)