V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
vjnjc
V2EX  ›  问与答

请问 mysql 是使用什么来解决幻读问题的?

  •  
  •   vjnjc · 2019-11-14 18:24:39 +08:00 · 2899 次点击
    这是一个创建于 1868 天前的主题,其中的信息可能已经有所发展或是发生改变。
    最近奔波于面试,有个面试官认为是间隙锁 gap lock 解决的幻读,有的面试官认为是 mvcc 解决的幻读,我太菜了,他们说啥就是啥吧,但又好想把他们约出来互相比划一下。有没有长得帅的来解答一下我的疑惑,到底是 gap lock 还是 mvcc 啊。。。

    还有什么是幻读,看网上教程举的例子都是 update xxx where field=value,这个 value 和你读出来的 value 不一致,但心理上这个解释说不过去啊
    ----来自一个菜鸟的真诚发问
    第 1 条附言  ·  2019-11-15 21:01:14 +08:00
    迫于没有人直接回答我的问题而且答对的,我自己去读了 mysql 的手册。又迫于有好多人收藏了,把我看到的说一下吧。

    1. 什么是幻读 Phantom ?
    假设我们在事务中间有条查询语句 “SELECT * FROM child WHERE id > 100 FOR UPDATE;
    ”,读出了 1 行 id=102 的数据。再次执行 query,读出了 2 行数据 id=101,id=102,其中多出来的数据是另一个事务插入的。

    2. 什么解决了幻读的问题?
    InnoDB 数据引擎使用了 next-lock 解决了幻读问题。next-lock 是使用了行锁 record lock(又叫 index-row locking)和间隙锁 gap-lock.



    Reference:
    https://dev.mysql.com/doc/refman/5.7/en/innodb-next-key-locking.html
    第 2 条附言  ·  2019-11-15 21:02:00 +08:00
    ----来自一个菜鸟的自问自答
    6 条回复    2019-11-30 11:34:40 +08:00
    haiyang416
        1
    haiyang416  
       2019-11-14 18:57:07 +08:00   ❤️ 1
    可以看下 MySQL 相关的书吧,图快的话可以看下这篇文章: https://tech.meituan.com/2014/08/20/innodb-lock.html
    taogen
        2
    taogen  
       2019-11-14 19:29:20 +08:00 via Android
    幻读是一个事务中,多次执行同一条 select 语句,如,第一次读 name 是张三,第二次读是 name 是李四。

    数据库中有两种锁,读取锁和写入锁。解决幻读的方法是设置事务隔离级别可解决。不同的事务隔离级别读写的限制不一样,即使用了不同的锁。解决幻读可以设置事务隔离级别为:“序列化”隔离级别。MySQL 中的“可重复度读”隔离级别解决了 range query 的幻读,这个隔离级别在 MySQL 中也是解决了幻读。
    xupefei
        3
    xupefei  
       2019-11-14 19:33:01 +08:00 via iPhone
    什么有的没的,就是 2 phase locking。
    https://en.m.wikipedia.org/wiki/Two-phase_locking

    这不是数据库基础概念吗
    ylsc633
        4
    ylsc633  
       2019-11-14 19:43:44 +08:00
    开始我也没搞明白. 后来听同事聊 知道了一些..

    然后顺手贴个网址吧

    http://interview.wzcu.com/%E6%95%B0%E6%8D%AE%E5%BA%93/MySQL.html#mysql%E4%BA%8B%E5%8A%A1%E7%9A%84%E9%9A%94%E7%A6%BB%E7%BA%A7%E5%88%AB
    pgxxhh
        5
    pgxxhh  
       2019-11-24 14:47:02 +08:00
    当前读是 间隙锁, 快照读 是 mvcc 吧
    wudanyang
        6
    wudanyang  
       2019-11-30 11:34:40 +08:00 via iPhone
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   992 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 21:46 · PVG 05:46 · LAX 13:46 · JFK 16:46
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.