Innodb 的幻读问题
Innodb 的 RR 是否彻底解决了幻读?
-- 只解决了大部分,少数的未解决(事务中先进行了快照读的操作“如未加锁的 select”,事务二进行了插入,然后再事务一中进行 当前读“ for update 、delete、update 等操作”,则会出现幻读)
什么事幻读?
复制代码
MVCC(多版本控制) 解决幻读
复制代码
在 RR 隔离级别下,一个事务中的多次查询,是不会查询到其他事务中的变更内容的,也就是快照读所以、也就是可以解决幻读问题。
间隙锁与幻读
复制代码
无法解决的幻读
在 mvcc 中快照读和间隙锁已经解决了大部分幻读,但是当一个事务中发生了快照读,在未加间隙锁前,另外的事务插入了数据,然后再进行当前读,则会发生幻读现象。
总结
在 RC 中,幻读是无法解决的,因为每一次 RC 中的快照读都会生成性格的快照,并且也没有间隙锁。
在 RR 级别中,因为有 MVCC 机制,对于无锁查询,属于快照读的,没有幻读,但是对于有加锁的查询,属于当前读,当前读是可以查询到其他事务的变更的所以还是会产生幻读。
想要彻底解决幻读,可以使用 serializable 这种隔离级别。
评论