Mysql各隔离级别问题演示

Mysql隔离级别

  • 读未提交(Read Uncommitted):能够读取到其他事务中未提交的内容,存在脏读问题。
  • 读已提交(Read Committed RC):只能读取其他事务已经提交的内容,存在不可重复读问题。
  • 可重复读(Repeated Read RR):在读取某行后不允许其他事务操作此行,直到事务结束,但是依然存在幻读问题。
  • 串行化(Serializable):一个事务的开始必须等待另一个事务的完成。

下面只演示前三个出现的问题。

建表

CREATE TABLE student(
	id INT,
	NAME VARCHAR(20),
	age INT,
	PRIMARY KEY(id)
);

插入数据

INSERT INTO student VALUE(1,'小张',10);
INSERT INTO student VALUE(2,'小丽',10);
INSERT INTO student VALUE(3,'图图',10);

修改隔离级别
下面是修改为Read Uncommitted的例子:

set session transaction isolation level read uncommitted;

脏读

打开两个CMD窗口,分别用于两个事务的操作
首先第一个事务输入

begin;
insert into student value(4,'熊二',15);

(注意此时第一个事务还没结束)
然后第二个事务直接输入

 select * from student;

此时第二个事务已经结束(没有使用begin等操作),而且查找结果为
在这里插入图片描述
紧接着我们对第一个事务窗口输入

rollback;

此时第一个事务结束,而且(4,‘熊二’,15)的数据并没有插入成功。
结果是第二个事务读到了第一个事务刚刚提交失败的数据。

不可重复读

第一个事务输入

begin;
insert into student value(4,'熊二',15);

第二个事务输入

begin;
select * from student;

结果为
在这里插入图片描述
接着第一个事务输入

rollback;

此时第一个事务结束,第二个事务再输入

select * from student;

得到的结果为
在这里插入图片描述
问题就在于第二个事务发现数据库一致性出现问题,即在同一个事务中,连续查出的student表结果不相同。

幻读

此时表的数据为
在这里插入图片描述
首先第二个事务输入

begin;
select* from student;

所得结果和上面的图一样
第一个事务输入

insert into student value(5,'翠花',13);

第二个事务再输入

select* from student;

所得结果为
在这里插入图片描述
我们发现事务二没有出现幻读的情况。(其实是因为mysql在一定程度上解决了幻读问题)
那么是否真的没有幻读?
第二个事务输入

update student set age=20;
commit;

在这里插入图片描述
我们发现事务二操作了5行,但对于事务二来说不应该只有4吗?
最后我们查看一下student表
在这里插入图片描述
发现事务一插入的翠花的age从13变成了20。

结尾

以上就是所有演示了,如有问题或错误请留言。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值