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

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

  •  
  •   vjnjc · 22 天前 · 640 次点击
    最近奔波于面试,有个面试官认为是间隙锁 gap lock 解决的幻读,有的面试官认为是 mvcc 解决的幻读,我太菜了,他们说啥就是啥吧,但又好想把他们约出来互相比划一下。有没有长得帅的来解答一下我的疑惑,到底是 gap lock 还是 mvcc 啊。。。

    还有什么是幻读,看网上教程举的例子都是 update xxx where field=value,这个 value 和你读出来的 value 不一致,但心理上这个解释说不过去啊
    ----来自一个菜鸟的真诚发问
    第 1 条附言  ·  21 天前
    迫于没有人直接回答我的问题而且答对的,我自己去读了 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 条附言  ·  21 天前
    ----来自一个菜鸟的自问自答
    6 回复  |  直到 2019-11-30 11:34:40 +08:00
        1
    haiyang416   22 天前   ♥ 1
    可以看下 MySQL 相关的书吧,图快的话可以看下这篇文章: https://tech.meituan.com/2014/08/20/innodb-lock.html
        2
    taogen   22 天前 via Android
    幻读是一个事务中,多次执行同一条 select 语句,如,第一次读 name 是张三,第二次读是 name 是李四。

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

    这不是数据库基础概念吗
        4
    ylsc633   22 天前
    开始我也没搞明白. 后来听同事聊 知道了一些..

    然后顺手贴个网址吧

    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
        5
    pgxxhh   12 天前
    当前读是 间隙锁, 快照读 是 mvcc 吧
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2193 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 30ms · UTC 15:06 · PVG 23:06 · LAX 07:06 · JFK 10:06
    ♥ Do have faith in what you're doing.