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

2020-07-23 09:26:16 +08:00
 gotonull

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

5947 次点击
所在节点    MySQL
34 条回复
zy445566
2020-07-23 11:17:36 +08:00
@gotonull 确实解决了,就是楼上说间隙锁,使用的时候通过 select +for update 锁定控制范围
mahone3297
2020-07-23 11:17:41 +08:00
极客时间,Mysql 的课有讲,解决了。
20 | 幻读是什么,幻读有什么问题?
zgzhang
2020-07-23 11:29:59 +08:00
在快照读读情况下,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
2020-07-23 11:34:20 +08:00
@mahone3297 谢谢,这就去学习学习
dxyhymn
2020-07-23 13:46:29 +08:00
解决了,推荐去看书,看完你就知道了,而且很透彻。
JasonLaw
2020-07-23 14:29:21 +08:00
@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
2020-07-23 14:35:34 +08:00
其实我不太明白为什么这么多人都是在说 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
2020-07-23 14:37:14 +08:00
@pangleon #19 “间隙锁又会引起别的 BUG”,可以详细说明一下是什么 bug 吗?谢谢。
pws22
2020-07-23 14:45:09 +08:00
没有完全解决
daimubai
2020-07-23 22:30:09 +08:00
确实使用的是 Next-lock-key 算法,它包含了 row lock 和 gap lock,默认情况下是解决了幻读的,不过不能完全避免吧,因为只会锁间隙,如果不在间隙添加也可以添加成功吧
daimubai
2020-07-23 22:31:21 +08:00
MVCC 并没有解决幻读,而是解决了 RC 下的脏读和 RR 下的不可重复读
wentaoliang
2020-07-23 23:00:33 +08:00
默认没有开启避免幻读,但是可以通过 for update 或者 share mode 来开启避免幻读。原理楼上以及说了
freelancher
2020-07-24 06:48:37 +08:00
讲真。我看原理的时候就解决了。这个是在隔离特性里面。自己去看一下吧。
leapV3
2020-07-24 10:20:16 +08:00
可重复读没有解决,需要加间隙锁

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/692386

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX