不可重复读:在同一个事务内,两个相同的查询返回了不同的结果不一致了
主要针对数据的update和delete,使用REPEATABLE_READ可重复读解决该问题,repeatable_read通过mvcc实现,读取的是本事务第一次查询时的快照,也叫快照读,保证了读一致性
幻读:事务二的数据操作仅仅是插入,事务一中两个查询返回了不同的结果,第二次查询可能返回了之前结果不存在的行
使用临键锁(Next-key Locking = record locks + grp locks)解决该问题,在Next-key Locking算法下,不仅锁住扫描到的索引,还锁住了这些索引覆盖的范围
mysql的rr级别已经保证了读一致性,为什么还会产生幻读?
是因为快照读和当前读读取的是不同时间节点的数据。当前读是读取最新版本数据,是加了锁的。insert ,update 和delete都会默认执行当前读,并且加锁,select需要手动加锁(for update|lock in share mode),这两种读不是一个东西。读方式有两种,执行select的时候是快照读,其余是当前读,所以,mvvc不能根本上解决幻读的情况,只能解决所有事务都是读操作的(不加锁)。
vans.png
网友评论