如果不能满足可重复读,有啥实际危害的例子?

2018-03-23 19:05:04 +08:00
 hheedat

MySQL 的可重复读隔离级别( RR ),在一个事务中可以保证读到的内容是一样的

今天同事问我这个隔离级别有啥用,我随手给他搜了个例子,说不满足的话会这样

这个例子形象的解释了 RC 下的表现,我同事问我,读到 900 不是挺好的么,实际就是 900 了啊...

我想了半天,好似没有想到不能满足 RR 的危害的例子。

同志们能否帮我想一个... 在一个事务中两次读到的不一致,有啥危害?(两次读的场景我都没想到,干嘛读两次)

9711 次点击
所在节点    MySQL
13 条回复
CH818
2018-03-23 19:10:08 +08:00
我觉得把因为不知道自己读到的数据是不是正确的。
他要是一开始拿 1000 去做计算,算完心想咱们读个 A 看看,读了一看呀,A 怎么变成 900 了?难道我前面做的计算都白做了么!
zarte
2018-03-23 19:53:41 +08:00
这个问题不就是为啥要有锁的原因么
billlee
2018-03-23 20:08:34 +08:00
BEGIN TRANSACTION
UPDATE 表 1 SELECT FROM ....
// 不可重复读
UPDATE 表 2 SELECT FROM ...
COMMIT

表 1 和 表 2 不一致了
luosuosile
2018-03-23 20:09:14 +08:00
我看不懂啊,问题在哪里。这不是两个事务吗,如果是银行的话这两个任务不是不能一起做吗。
假如能这么做的话,请问能不能给我解释下这个图的问题在哪里呀?
不可重复读是说,一个事务只批准读取一次。
还是不能两个事务同时读取一个数据?
fcten
2018-03-23 20:15:07 +08:00
事务 A:select 最近 1 个月注册的新用户,把他们的用户组改成 GroupA
事务 B:注册了一个新用户,commit
事务 A:select 最近 1 个月注册的新用户,给他们发送一条私信:恭喜你升级为 GroupA !

不一致本身没有危害。有危害的是不知道会不一致。
Keita1314
2018-03-23 20:22:43 +08:00
ACID 啊
xhystc
2018-03-23 20:31:51 +08:00
可重复读不是真的要读两次,而是指一个事务在使用这个值的时候,这个值被其他事务修改了,那么以这个值为基础的计算都是错的,如果计算后再写回数据库就会造成不一致
honam
2018-03-23 20:35:28 +08:00
比较认同一楼的,其余都感觉答不到点。。。
hheedat
2018-03-23 22:25:34 +08:00
@fcten 你这个栗子举得很好!
alcarl
2018-03-24 08:48:38 +08:00
5 楼那个并不能算危害,同一个任务两次 select 本身就是多余的。mysql 默认 rr 主要是为了主从同步时,采用逻辑 sql 同步时的一致性,因为主库的 sql 是并发执行的,会有两个事务一起再跑,从库同步是单线程的,不会有两个事务同时在跑,如果不是 rr,出现楼主的栗子说的情况时,主从数据就不一致了
MortyP
2018-03-24 09:29:54 +08:00
头像好评,我的微信头像也是他
bxb100
2018-03-24 16:45:05 +08:00
先读后写,使用乐观锁.
hheedat
2018-03-25 11:45:27 +08:00
@alcarl 你这个很好!

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

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

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

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

© 2021 V2EX