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

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

proxy

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

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

rr

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

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

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

9785 次点击
所在节点   MySQL  MySQL
13 条回复
CH818
CH818
2018-03-23 19:10:08 +08:00
我觉得把因为不知道自己读到的数据是不是正确的。
他要是一开始拿 1000 去做计算,算完心想咱们读个 A 看看,读了一看呀,A 怎么变成 900 了?难道我前面做的计算都白做了么!
zarte
zarte
2018-03-23 19:53:41 +08:00
这个问题不就是为啥要有锁的原因么
billlee
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