写点什么

Innodb 的幻读问题

作者:想要飞的猪
  • 2023-02-13
    广东
  • 本文字数:677 字

    阅读完需:约 2 分钟

Innodb 的 RR 是否彻底解决了幻读?


-- 只解决了大部分,少数的未解决(事务中先进行了快照读的操作“如未加锁的 select”,事务二进行了插入,然后再事务一中进行 当前读“ for update 、delete、update 等操作”,则会出现幻读)


什么事幻读?


    在一个事务中做范围查询(select)的过程中,有另外的事务对范围内的记录做了修改(insert),导致同一个事务中范围查询的结果不一致的现象。
复制代码


MVCC(多版本控制) 解决幻读


  在mvcc中读取数据有两种方式:当前读,快照度
快照读:就是读取的是快照数据,即快照生成的那一刻的数据,像平时未加锁的select 语句就是快照读。
复制代码


在 RR 隔离级别下,一个事务中的多次查询,是不会查询到其他事务中的变更内容的,也就是快照读所以、也就是可以解决幻读问题。


间隙锁与幻读


在一个事务中快照读是可以解决幻读,但是在一事务中有当前读时就会发生当前读,所以还是会出现幻读,但是间隙锁的出现会保证在一个事务中,出现当前读时(ELECT FOR UPDATE、UPDATE、DELETE 等操作 )会锁住所查数据的间隙,另外的事务无法进行插入操作。
复制代码


无法解决的幻读


在 mvcc 中快照读和间隙锁已经解决了大部分幻读,但是当一个事务中发生了快照读,在未加间隙锁前,另外的事务插入了数据,然后再进行当前读,则会发生幻读现象。


总结


在 RC 中,幻读是无法解决的,因为每一次 RC 中的快照读都会生成性格的快照,并且也没有间隙锁。


在 RR 级别中,因为有 MVCC 机制,对于无锁查询,属于快照读的,没有幻读,但是对于有加锁的查询,属于当前读,当前读是可以查询到其他事务的变更的所以还是会产生幻读。


想要彻底解决幻读,可以使用 serializable 这种隔离级别。

用户头像

还未添加个人签名 2020-06-05 加入

还未添加个人简介

评论

发布
暂无评论
Innodb 的幻读问题_innodb_想要飞的猪_InfoQ写作社区