文章目录

  • ​​2.7 幻读​​
  • ​​2.7.1 幻读解决情况1):​​
  • ​​2.7.2 幻读解决情况2):​​
  • ​​2.7.3 幻读问题出现情况1):​​
  • ​​2.7.3 特殊情况:​​

2.7 幻读

概念:一次事务多次读取到的条数不一致而引发的问题;

在InnoDB(暂时理解是MySQL)中幻读在很多地方都得到了解决,但在一些特殊的情况下,还是会引发幻读问题;

为什么有的情况下能解决,有的情况下解决不了?因为一次事务多次读取到的条数不一致会导致有很多情况发生!

2.7.1 幻读解决情况1):

还原数据:

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;

观察变化:

到底什么才是幻读?_sql

幻读问题得到解决

2.7.2 幻读解决情况2):

还原数据

案例:

session-01

session-02

begin;

begin;

select sum(money) from account;

insert into account values(3,‘c’,1000);

commit;

select sum(money) from account;

观察变化:

到底什么才是幻读?_隔离级别_02

2.7.3 幻读问题出现情况1):

还原数据

  • 案例:

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;

观察变化:

到底什么才是幻读?_幻读_03

2.7.3 特殊情况:

还原数据

  • 案例:

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);

观察变化:

到底什么才是幻读?_幻读_04

Tips:严格意义来说,上述案例是MySQL的快照机制导致的,不能算幻读;关于幻读我们理解概念就行,即:两次读取到的条数不一致!这就是幻读