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

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

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

5450 次点击
所在节点    MySQL
34 条回复
iseki
2020-07-23 09:28:36 +08:00
没有吧
zarte
2020-07-23 09:29:41 +08:00
只是事务解决不了并发
iseki
2020-07-23 09:30:01 +08:00
你看看 PostgreSQL…那个没有…有谓词锁🔒
pingdongyi
2020-07-23 09:30:25 +08:00
看如何定义幻读
iseki
2020-07-23 09:30:39 +08:00
@iseki 但是 pg 默认级别好象是读提交
nwg
2020-07-23 09:31:21 +08:00
插入类型的幻读解决不了 比如:预定会议室问题
更新类别的幻读解决了 多次查询是一个数据
xuwei0056
2020-07-23 09:32:42 +08:00
解决了
BBCCBB
2020-07-23 09:32:45 +08:00
解决了, 有 gap lock.
ylsc633
2020-07-23 09:32:59 +08:00
bear2000
2020-07-23 09:47:23 +08:00
解决了。

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

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

PS:推荐看一看《 MySQL 技术内幕 InnoDB 存储引擎》
RedBeanIce
2020-07-23 09:55:35 +08:00
mvcc,间隙锁(书上看的)
huntcool001
2020-07-23 10:05:01 +08:00
没有完全解决.
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
2020-07-23 10:15:25 +08:00
幻读影响你业务吗?
hheedat
2020-07-23 10:25:17 +08:00
解决了 MVCC + gap lock
maigebaoer
2020-07-23 10:32:31 +08:00
并没有
jimmyismagic
2020-07-23 10:35:48 +08:00
默认并没有解决幻读,因为只锁了行,对于批量处理,你可能在删了一批符合条件的数据后,又读到新的符合条件的数据
liprais
2020-07-23 10:41:30 +08:00
没有
新增的不会看到
update 的会有问题
gadsavesme
2020-07-23 10:46:29 +08:00
快照读解决,当前读还是有问题
pangleon
2020-07-23 11:07:22 +08:00
MYSQL 用间隙锁解决幻读问题,结果间隙锁又会引起别的 BUG,所以 RR 级别很多公司都不推荐使用。都是用 RC 了,毕竟人家 ORACLE 就是默认 RC 有谁去改了么?
gotonull
2020-07-23 11:11:58 +08:00
@lscexpress 没有,只是面试的时候被问到了,我说没解决,面试官说解决了。所以来问问大神们。结果大家的回答还是各种说法都有,都给我整懵了!

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

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

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

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

© 2021 V2EX