概念:一次事务多次读取到的条数不一致而引发的问题;
在InnoDB(暂时理解是MySQL)中幻读在很多地方都得到了解决,但在一些特殊的情况下,还是会引发幻读问题;
为什么有的情况下能解决,有的情况下解决不了?因为一次事务多次读取到的条数不一致会导致有很多情况发生!
还原数据:
update account set money=1000;
-- 设置隔离级别为repeatable read
set global transaction isolation level repeatable read;
记得重启客户端
session-01 | session-02 |
---|---|
begin; | |
begin; | |
select * from account; | |
insert into account values(3,‘c’,1000); | |
commit; | |
select * from account; |
观察变化:
幻读问题得到解决
还原数据
案例:
session-01 | session-02 |
---|---|
begin; | |
begin; | |
select sum(money) from account; | |
insert into account values(3,‘c’,1000); | |
commit; | |
select sum(money) from account; |
观察变化:
还原数据
session-01 | session-02 |
---|---|
begin; | |
begin; | |
select count(id) from account; | |
insert into account values(3,‘c’,1000); | |
commit; | |
select count(id) from account; | |
update account set money=0; | |
select count(id) from account; |
观察变化:
还原数据
session-01 | session-02 |
---|---|
begin; | |
begin; | |
select * from account; | |
select * from account; | |
insert into account values(3,“c”,1000); | |
commit; | |
select * from account; | |
insert into account values(3,“c”,1000); |
观察变化:
Tips:严格意义来说,上述案例是MySQL的快照机制导致的,不能算幻读;关于幻读我们理解概念就行,即:两次读取到的条数不一致!这就是幻读