MySQL脏读、不可重复读、幻读案例演示

本文详细介绍了如何在MySQL中设置不同的事务隔离级别,演示了脏读、不可重复读和幻读现象,并通过实际操作展示了这些隔离级别的效果。最后,强调了序列化隔离级别对防止这些问题的重要性。

测试前准备

准备一张表tran_test ,id为主键,使用innodb存储引擎

CREATE TABLE tran_test ( id INT PRIMARY KEY, NAME VARCHAR ( 10 ) ) ENGINE = INNODB;

插入3条数据

insert into tran_test values(1,'zhangsan');
insert into tran_test values(2,'wangwu');
insert into tran_test values(3,'lisi');

打开的会话窗口都需要关闭自动提交,默认为1:表示开启自动提交,设置为0:表示关闭自动提交

select @@autocommit;

set autocommit = 0;

事务隔离级别

事务的四个隔离级别(mysql默认可重复度,oracle默认读已提交)

  • read uncommitted (读未提交)
    会产生:脏读、幻读、不可重复度
  • read commited (读已提交)
    会产生:幻读、不可重复度
  • repeatable read (可重复读)
    会产生:幻读
  • seariable (串行执行)
    不会产生任何异常

脏读

一个事务会读到另一个未提交的事务数据。

不可重复读

一个事务内多次读取到的数据不一致,A事务第一次读到值是1, B事务把1修改成2,并且提交了,A事务第二次读到值也变成了2,针对update。

幻读

一个事务内多次读取到的数据不一致,第一次读到1条,第二次读到2条。针对insert,delete,数据行数发生了变化。

脏读问题测试

1、设置事务隔离级别

A:set session transaction isolation level read uncommitted;
A:start transaction;
A:insert into tran_test values(4,'zhaoliu');
A:select * from tran_test; --可以查询到最新插入的数据
B:set session transaction isolation level read uncommitted;
B:select * from tran_test; -- 也可以查询A最新插入的数据,尽管A的此时的事务还未提交

在这里插入图片描述

不可重复读问题测试

重复脏读的流程发现,新建的会话窗口是读不到其他会话中未提交的事务的。

在这里插入图片描述

但是会产生不可重复读问题

A:set session transaction isolation level read committed;
A:start transaction;
A:select * from tran_test where id = 1; --结果为zhangsan
B:start transaction;
B:update tran_test set name = 'zs' where id = 1; --把id为1的name修改为zs
A:select * from tran_test where id = 1; -- B未提交所以A此时查询结果还是zhangsan
B:commit;
A:select * from tran_test where id = 1; -- B事务提交后,A再查询此时结果已经变成了zs

A再同一个事务中,两次查询结果不一致。

幻读问题测试

重复上限测试,不可重复读和脏读问题都不存在。

A:set session transaction isolation level read committed;
A:start transaction;
A:select * from tran_test where id = 4; --结果为空
B:start transaction;
B:insert into tran_test values(4,'zhaoliu'); -- B插入一条id=4的数据
A:select * from tran_test where id = 4; --结果依旧为空
B:commit; -- B提交事务
A:select * from tran_test where id = 4; --结果依旧为空
A:insert into tran_test values(4,'zhaoliu'); -- 插入失败,报主键冲突
insert into tran_test values(4,'zhaoliu')
> 1062 - Duplicate entry '4' for key 'PRIMARY'
> 时间: 0s

A事务在查询时数据明明不存在,但插入却报主键冲突,就像出现幻觉一样。

当然隔离级别设置为序列化后,脏读、不可重复读、幻读问题都不存在,可自行测试。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

码拉松

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

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

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

打赏作者

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

抵扣说明:

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

余额充值