MySQL 的可重复读隔离级别( RR ),在一个事务中可以保证读到的内容是一样的
今天同事问我这个隔离级别有啥用,我随手给他搜了个例子,说不满足的话会这样
这个例子形象的解释了 RC 下的表现,我同事问我,读到 900 不是挺好的么,实际就是 900 了啊...
我想了半天,好似没有想到不能满足 RR 的危害的例子。
同志们能否帮我想一个... 在一个事务中两次读到的不一致,有啥危害?(两次读的场景我都没想到,干嘛读两次)
1
CH818 2018-03-23 19:10:08 +08:00 via iPhone 2
我觉得把因为不知道自己读到的数据是不是正确的。
他要是一开始拿 1000 去做计算,算完心想咱们读个 A 看看,读了一看呀,A 怎么变成 900 了?难道我前面做的计算都白做了么! |
2
zarte 2018-03-23 19:53:41 +08:00
这个问题不就是为啥要有锁的原因么
|
3
billlee 2018-03-23 20:08:34 +08:00
BEGIN TRANSACTION
UPDATE 表 1 SELECT FROM .... // 不可重复读 UPDATE 表 2 SELECT FROM ... COMMIT 表 1 和 表 2 不一致了 |
4
luosuosile 2018-03-23 20:09:14 +08:00
我看不懂啊,问题在哪里。这不是两个事务吗,如果是银行的话这两个任务不是不能一起做吗。
假如能这么做的话,请问能不能给我解释下这个图的问题在哪里呀? 不可重复读是说,一个事务只批准读取一次。 还是不能两个事务同时读取一个数据? |
5
fcten 2018-03-23 20:15:07 +08:00 1
事务 A:select 最近 1 个月注册的新用户,把他们的用户组改成 GroupA
事务 B:注册了一个新用户,commit 事务 A:select 最近 1 个月注册的新用户,给他们发送一条私信:恭喜你升级为 GroupA ! 不一致本身没有危害。有危害的是不知道会不一致。 |
6
Keita1314 2018-03-23 20:22:43 +08:00
ACID 啊
|
7
xhystc 2018-03-23 20:31:51 +08:00 via Android
可重复读不是真的要读两次,而是指一个事务在使用这个值的时候,这个值被其他事务修改了,那么以这个值为基础的计算都是错的,如果计算后再写回数据库就会造成不一致
|
8
honam 2018-03-23 20:35:28 +08:00
比较认同一楼的,其余都感觉答不到点。。。
|
10
alcarl 2018-03-24 08:48:38 +08:00 via Android 2
5 楼那个并不能算危害,同一个任务两次 select 本身就是多余的。mysql 默认 rr 主要是为了主从同步时,采用逻辑 sql 同步时的一致性,因为主库的 sql 是并发执行的,会有两个事务一起再跑,从库同步是单线程的,不会有两个事务同时在跑,如果不是 rr,出现楼主的栗子说的情况时,主从数据就不一致了
|
11
MortyP 2018-03-24 09:29:54 +08:00 via Android
头像好评,我的微信头像也是他
|
12
bxb100 2018-03-24 16:45:05 +08:00 via Android
先读后写,使用乐观锁.
|