MySQL 在默认的事务隔离级别下到底有没有解决幻读问题啊
MySQL 在默认的事务隔离级别下到底有没有解决幻读问题啊
|
isekiJul 23, 2020 via Android
1
没有吧
|
|
zarteJul 23, 2020
2
只是事务解决不了并发
|
|
isekiJul 23, 2020 via Android
3
你看看 PostgreSQL…那个没有…有谓词锁🔒
|
|
pingdongyiJul 23, 2020 via Android
4
看如何定义幻读
|
|
nwgJul 23, 2020
6
插入类型的幻读解决不了 比如:预定会议室问题
更新类别的幻读解决了 多次查询是一个数据 |
|
xuwei0056Jul 23, 2020
7
解决了
|
|
8
解决了, 有 gap lock.
|
|
ylsc633Jul 23, 2020
9
|
|
10
解决了。
在非锁定读的情况下会读取一个快照数据,不会出现幻读。 在锁定读的情况下会有间隙锁,也不会出现幻读。 PS:推荐看一看《 MySQL 技术内幕 InnoDB 存储引擎》 |
|
RedBeanIceJul 23, 2020
11
mvcc,间隙锁(书上看的)
|
|
12
没有完全解决.
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!!!! |
|
lscexpressJul 23, 2020
13
幻读影响你业务吗?
|
|
hheedatJul 23, 2020
14
解决了 MVCC + gap lock
|
|
maigebaoerJul 23, 2020 via Android
15
并没有
|
|
jimmyismagicJul 23, 2020
16
默认并没有解决幻读,因为只锁了行,对于批量处理,你可能在删了一批符合条件的数据后,又读到新的符合条件的数据
|
|
F281M6Dh8DXpD1g2Jul 23, 2020 via iPhone
17
没有
新增的不会看到 update 的会有问题 |
|
gadsavesmeJul 23, 2020
18
快照读解决,当前读还是有问题
|
|
pangleonJul 23, 2020
19
MYSQL 用间隙锁解决幻读问题,结果间隙锁又会引起别的 BUG,所以 RR 级别很多公司都不推荐使用。都是用 RC 了,毕竟人家 ORACLE 就是默认 RC 有谁去改了么?
|
|
20
@lscexpress 没有,只是面试的时候被问到了,我说没解决,面试官说解决了。所以来问问大神们。结果大家的回答还是各种说法都有,都给我整懵了!
|
|
mahone3297Jul 23, 2020
22
极客时间,Mysql 的课有讲,解决了。
20 | 幻读是什么,幻读有什么问题? |
|
23
在快照读读情况下,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 |
|
24
@mahone3297 谢谢,这就去学习学习
|
|
dxyhymnJul 23, 2020
25
解决了,推荐去看书,看完你就知道了,而且很透彻。
|
|
JasonLawJul 23, 2020
26
@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.”这段里面。 |
|
JasonLawJul 23, 2020
27
其实我不太明白为什么这么多人都是在说 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 才能够解决。 |
|
pws22Jul 23, 2020
29
没有完全解决
|
|
daimubaiJul 23, 2020 via iPhone
30
确实使用的是 Next-lock-key 算法,它包含了 row lock 和 gap lock,默认情况下是解决了幻读的,不过不能完全避免吧,因为只会锁间隙,如果不在间隙添加也可以添加成功吧
|
|
daimubaiJul 23, 2020 via iPhone
31
MVCC 并没有解决幻读,而是解决了 RC 下的脏读和 RR 下的不可重复读
|
|
wentaoliangJul 23, 2020
32
默认没有开启避免幻读,但是可以通过 for update 或者 share mode 来开启避免幻读。原理楼上以及说了
|
|
freelancherJul 24, 2020
33
讲真。我看原理的时候就解决了。这个是在隔离特性里面。自己去看一下吧。
|
|
leapV3Jul 24, 2020
34
可重复读没有解决,需要加间隙锁
|