1

请教下数据库相关的疑问:什么业务场景下需要禁止幻读?什么业务场景下允许幻读?

 1 year ago
source link: https://www.v2ex.com/t/894052
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

V2EX  ›  程序员

请教下数据库相关的疑问:什么业务场景下需要禁止幻读?什么业务场景下允许幻读?

  leeqingshui · 3 小时 42 分钟前 · 560 次点击

MySQL 默认隔离级别时 RR ,通过 MVCC 版本链 + 锁( Gap Lock 、Next-Key Lock )解决幻读问题。

具体而言,RR 级别解决幻读是:

  • ① 借助 MVCC 版本链,多次 SELECT 下只有第一次读取一次快照,后续复用这个快照
  • ② 借助锁( Gap Lock 、Next-Key Lock ),在 SELECT FOR UPDATE 、插入和更新三张操作下会锁住间隙

若不是 RR 级别,为 RC 级别存在幻读问题,因为:

  • ① 借助 MVCC 版本链,多次 SELECT 下每次都读取快照
  • ② 不使用( Gap Lock 、Next-Key Lock )

所以,RC 级别下同一事务下,多次 SELECT 可能读到不同的行数,插入时若相同记录已存在则爆索引冲突,更新时会将其他事务新增的数据同时更新掉(这里描述不知是否正确)。 那么,现在有以下疑问:

  • 多次 SELECT 下出现了不同了行数,即幻影数据行,出现了幻读,出现了不同行数,又有什么问题?什么业务场景下不能忍受这种情况发生?
  • 插入时爆索引冲突有什么问题?更新时将其他数据也更新了又有什么问题?(一般更新时会加条件,也不会更新新增的数据下)

最终,在使用 MySQL 时,什么下的业务场景下需要避免上述问题呢(设置 RR 级别解决幻读),什么场景下允许上述问题呢?(设置 RC 级别)


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK