CC00041.bigdatajava——|Java&MySQL单表/约束/事务.V19|——|MySQL.v19|幻读演示及解决|

一、幻读演示及解决
### --- 幻读演示及解决

——>        幻读: select 某记录是否存在,不存在,准备插入此记录,
——>        但执行 insert 时发现此记录已存在,无法插入,此时就发生了幻读。

### --- 打开AB窗口,选择数据库开启事务
### --- A窗口先执行一次查询操作

-- 假设要再添加一条id为3的 数据,在添加之前先判断是否存在
select * from account where id = 3;
### --- B窗口插入一条数据,提交事务

INSERT INTO account VALUES(3,'lucy',1000);
commit;
### --- A 窗口执行 插入操作, 发现报错. 出现幻读

——>        见鬼了,我刚才读到的结果应该可以支持我这样操作才对啊,为什么现在不可以
二、解决幻读问题
### --- 解决幻读问题

——>        将事务隔离级别设置到最高 SERIALIZABLE ,以挡住幻读的发生
——>        如果一个事务,使用了SERIALIZABLE——可串行化隔离级别时,
——>       在这个事务没有被提交之前 , 其的线程,只能等到当前操作完成之后,才能进行操作,
——>       这样会非常耗时,而且,影响数据库的性能,数据库不会使用这种隔离级别
### --- 恢复数据

DELETE FROM account WHERE id = 3;
2、打开A 窗口 将数据隔离级别提升到最高
3、打开 A B 窗口, 选择数据库 开启事务
set global transaction isolation level SERIALIZABLE;
### --- A 窗口 先执行一次查询操作
SELECT * FROM account WHERE id = 3;

### --- B 窗口插入一条数据
INSERT INTO account VALUES(3,'lucy',1000);
### --- A 窗口执行 插入操作, 提交事务 数据插入成功.
### --- B 窗口在 A窗口提交事务之后, 再执行,但是主键冲突出现错误

INSERT INTO account VALUES(3,'lucy',1000);
commit;
### --- 总结:

——>        serializable 串行化可以彻底解决幻读,但是 事务只能排队执行,
——>        严重影响效率,数据库不会使用这种隔离级别
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yanqi_vip

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值