Mysql:RR隔离级别下的幻读
众所周知,Mysql在InnoDB下有四种隔离级别:
未提交读(Read Uncommitted)
提交后读(Read Committed)
可重复读(Repeatable Read)
串⾏化(Serializable)
其中可重复读(RR)可以避免脏读( a事务读到b事务回滚前的数据)以及可不重复读( a事务在b事务修改提交的前后,两次分别读到的数据不⼀致)。但是对于幻读(a事务在b事务insert提交前后,两次分别读到的数据不⼀致),却存在争议。
下⾯我们来做⼀个试验:
jquery附件下载地址linux新建文件夹命令对于下⾯这张简单的数据表
id        num
1        11
2        22
3        33
我们开启a、b两个事务
a事务                b事务
begin                begin
select * from tb    ----
手机php视频----                    insert into tb (id,num)values(4,44)graven
----                    commit
select * from tb    ----
commit
试验结果:a事务的两次select查询到的结果相同,在后⼀次查询中没有返回新插⼊id=4的那条记录。
据此,很多⼈判断说RR隔离级别下“不存在”幻读。
但果真如此吗?----
出现上⾯的试验结果,是因为在RR隔离级别事务下,Mysql会对前⼀次select的结果快照。所以第⼆次select其实是快照读(这也正是RR隔离级别下能够避免不可重复读的策略)。
如果我们把试验条件稍作修改,同样开启a、b两个事务:
a事务                b事务
begin                begin
mysql怎么读英语select * from tb    ----
----                    insert into tb (id,num)values(5,55)
----                    commit
controller settings是什么意思
update tb set num=num+1    ----        #此处a事务做⼀次修改操作
select * from tb    ----
commit
试验结果:在a事务的第⼆次select中出现了b事务新插⼊的id=5的记录。
由于做了update操作,之前的快照失效了,所以说RR隔离级别下的快照策略并没能真正避免幻读。
ps. 假如给第⼆次的select查询上锁(⽆论是共享锁还是排它锁),也会得到同样的结果,都会令快照失效。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。