JAVA全系列 教程
3762个小节阅读:7088.1k
目录
C语言快速入门
JAVA全系列 教程
面向对象的程序设计语言
Python全系列 教程
Python3.x版本,未来主流的版本
人工智能 教程
顺势而为,AI创新未来
大厂算法 教程
算法,程序员自我提升必经之路
C++ 教程
一门通用计算机编程语言
微服务 教程
目前业界流行的框架组合
web前端全系列 教程
通向WEB技术世界的钥匙
大数据全系列 教程
站在云端操控万千数据
AIGC全能工具班
A A
White Night
幻读名如其文,它就像发生了某种幻觉一样,在一个事务中明明没有查到主键为 X 的数据,但主键为 X 的数据就是插入不进去,就像某种幻觉一样。幻读演示的执行流程如下:
执行步骤 | 客户端1(窗口1) | 客户端2(窗口2) | 说明 |
---|---|---|---|
第 1 步 | set session transaction isolation level repeatable read; start transaction; select * from userinfo where id=3; | 设置事务隔离级别为可重复读; 开启事务; 查询用户编号为 3 的数据,查询结果为空。 | |
第 2 步 | start transaction; insert into userinfo(id,name,balance) values(3,'Spring',100); commit; | 开启事务; 添加用户,用户编号为 3; 提交事务。 | |
第 3 步 | insert into userinfo(id,name,balance) values(3,'Spring',100); | 窗口 2 添加用户编号为 3 的数据,执行失败。 | |
第 4 步 | select * from userinfo where id=3; | 查询用户编号为 3 的数据,查询结果为空。 |
在窗口1和窗口2修改事务隔离级别为可重复读。
xxxxxxxxxx
set session transaction isolation level repeatable read;
设置窗口 2 为可重复读,可重复有幻读的问题,查询编号为 3 的用户,具体执行 SQL 如下:
xxxxxxxxxx
start transaction;
select * from userinfo where id=3;
注意:
从上述结果可以看出,查询的结果中 id=3 的数据为空。
开启窗口 1 的事务,插入用户编号为 3 的数据,然后成功提交事务,执行 SQL 如下:
xxxxxxxxxx
start transaction;
insert into userinfo(id,name,balance) values(3,'Spring',100);
commit;
在窗口 2 中插入用户编号为 3 的数据,执行 SQL 如下:
xxxxxxxxxx
insert into userinfo(id,name,balance) values(3,'Spring',100);
注意:
添加用户数据失败,提示表中已经存在了编号为 3 的数据,且此字段为主键,不能添加多个。
在窗口 2 中,重新执行查询:
xxxxxxxxxx
select * from userinfo where id=3;
注意:
在此事务中查询明明没有编号为 3 的用户,但插入的时候却却提示已经存在了,这就是幻读。
二者描述的则重点不同,不可重复读描述的侧重点是修改操作,而幻读描述的侧重点是添加和删除操作。