跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • MySQL 可重复读隔离级别下是否解决了幻读问题
未分類
14 7 月 2020

MySQL 可重复读隔离级别下是否解决了幻读问题

MySQL 可重复读隔离级别下是否解决了幻读问题

資深大佬 : gotonull 7

MySQL 在默认的事务隔离级别下到底有没有解决幻读问题啊

大佬有話說 (34)

  • 資深大佬 : iseki

    没有吧

  • 資深大佬 : zarte

    只是事务解决不了并发

  • 資深大佬 : iseki

    你看看 PostgreSQL…那个没有…有谓词锁

  • 資深大佬 : pingdongyi

    看如何定义幻读

  • 資深大佬 : iseki

    @iseki 但是 pg 默认级别好象是读提交

  • 資深大佬 : nwg

    插入类型的幻读解决不了 比如:预定会议室问题
    更新类别的幻读解决了 多次查询是一个数据

  • 資深大佬 : xuwei0056

    解决了

  • 資深大佬 : BBCCBB

    解决了, 有 gap lock.

  • 資深大佬 : ylsc633

    http://interview.wzcu.com/%E6%95%B0%E6%8D%AE%E5%BA%93/MVCC%E5%92%8CNext-Key%20Locks.html#%E5%A6%82%E4%BD%95%E8%A7%A3%E5%86%B3%E5%B9%BB%E8%AF%BB

  • 資深大佬 : bear2000

    解决了。

    在非锁定读的情况下会读取一个快照数据,不会出现幻读。

    在锁定读的情况下会有间隙锁,也不会出现幻读。

    PS:推荐看一看《 MySQL 技术内幕 InnoDB 存储引擎》

  • 資深大佬 : RedBeanIce

    mvcc,间隙锁(书上看的)

  • 資深大佬 : huntcool001

    没有完全解决.
    StackoverFlow 上这个例子: https://stackoverflow.com/questions/5444915/how-to-produce-phantom-reads

    create table ab(a int primary key, b int);

    Tx1:
    begin;
    select * from ab; // empty set

    Tx2:
    begin;
    insert into ab values(1,1);
    commit;
    Tx1:
    select * from ab; // empty set, expected phantom read missing.
    update ab set b = 2 where a = 1; // 1 row affected.
    select * from ab; // 1 row. phantom read here!!!!

  • 資深大佬 : lscexpress

    幻读影响你业务吗?

  • 資深大佬 : hheedat

    解决了 MVCC + gap lock

  • 資深大佬 : maigebaoer

    并没有

  • 資深大佬 : jimmyismagic

    默认并没有解决幻读,因为只锁了行,对于批量处理,你可能在删了一批符合条件的数据后,又读到新的符合条件的数据

  • 資深大佬 : liprais

    没有
    新增的不会看到
    update 的会有问题

  • 資深大佬 : gadsavesme

    快照读解决,当前读还是有问题

  • 資深大佬 : pangleon

    MYSQL 用间隙锁解决幻读问题,结果间隙锁又会引起别的 BUG,所以 RR 级别很多公司都不推荐使用。都是用 RC 了,毕竟人家 ORACLE 就是默认 RC 有谁去改了么?

  • 主 資深大佬 : gotonull

    @lscexpress 没有,只是面试的时候被问到了,我说没解决,面试官说解决了。所以来问问大神们。结果大家的回答还是各种说法都有,都给我整懵了!

  • 資深大佬 : zy445566

    @gotonull 确实解决了,就是上说间隙锁,使用的时候通过 select +for update 锁定控制范围

  • 資深大佬 : mahone3297

    极客时间,Mysql 的课有讲,解决了。
    20 | 幻读是什么,幻读有什么问题?

  • 資深大佬 : zgzhang

    在快照读读情况下,mysql 通过 mvcc 来避免幻读。
    在当前读读情况下,mysql 通过 next-key 来避免幻读。
    select * from t where a=1;属于快照读
    select * from t where a=1 lock in share mode;属于当前读

    不能把快照读和当前读得到的结果不一样这种情况认为是幻读,这是两种不同的使用。所以我认为 mysql 的 rr 级别是解决了幻读的。
    https://github.com/Yhzhtk/note/issues/42

  • 主 資深大佬 : gotonull

    @mahone3297 谢谢,这就去学习学习

  • 資深大佬 : dxyhymn

    解决了,推荐去看书,看完你就知道了,而且很透彻。

  • 資深大佬 : JasonLaw

    @huntcool001 #12 +1,并没有完全解决。

    https://dev.mysql.com/doc/refman/8.0/en/innodb-consistent-read.html 中也描述了这个问题。在“The snapshot of the database state applies to SELECT statements within a transaction, not necessarily to DML statements.”这段里面。

  • 資深大佬 : JasonLaw

    其实我不太明白为什么这么多人都是在说 gap locking,文档里明明说的是 next-key locking 。

    https://dev.mysql.com/doc/refman/8.0/en/innodb-next-key-locking.html 中说了“To prevent phantoms, InnoDB uses an algorithm called next-key locking that combines index-row locking with gap locking.”,很明显,单纯的 gap locking 是不能阻止幻读的,index-row locking 加上 gap locking 才能够解决。

  • 資深大佬 : JasonLaw

    @pangleon #19 “间隙锁又会引起别的 BUG”,可以详细说明一下是什么 bug 吗?谢谢。

  • 資深大佬 : pws22

    没有完全解决

  • 資深大佬 : daimubai

    确实使用的是 Next-lock-key 算法,它包含了 row lock 和 gap lock,默认情况下是解决了幻读的,不过不能完全避免吧,因为只会锁间隙,如果不在间隙添加也可以添加成功吧

  • 資深大佬 : daimubai

    MVCC 并没有解决幻读,而是解决了 RC 下的脏读和 RR 下的不可重复读

  • 資深大佬 : wentaoliang

    默认没有开启避免幻读,但是可以通过 for update 或者 share mode 来开启避免幻读。原理上以及说了

  • 資深大佬 : freelancher

    讲真。我看原理的时候就解决了。这个是在隔离特性里面。自己去看一下吧。

  • 資深大佬 : leapV3

    可重复读没有解决,需要加间隙锁

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具