💗推荐阅读文章💗
- 🌸JavaSE系列🌸👉1️⃣《JavaSE系列教程》
- 🌺MySQL系列🌺👉2️⃣《MySQL系列教程》
- 🍀JavaWeb系列🍀👉3️⃣《JavaWeb系列教程》
- 🌻SSM框架系列🌻👉4️⃣《SSM框架系列教程》
🎉本博客知识点收录于🎉👉🚀《MySQL系列教程》🚀—>✈️12【事务的隔离级别】✈️
文章目录
- 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; |
观察变化:
幻读问题得到解决
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; |
观察变化:
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; |
观察变化:
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); |
观察变化:
Tips:严格意义来说,上述案例是MySQL的快照机制导致的,不能算幻读;关于幻读我们理解概念就行,即:两次读取到的条数不一致!这就是幻读