mysql事务并发执行下隔离级别问题-脏读、不可重复读、幻读(虚读)

事务并发

多事务并发执行的出现的问题

对于同时运行的多个事务,当这些事务访问数据库中相同的数据时,如果没有采取必要的隔离机制,就会导致各种并发问题:
脏读:对于两个事务T1,T2。T1读取了T2更新但还未提交的字段之后,若T2回滚,T1读取的内容就是临时且无效的。
不可重复读:对于两个事务T1,T2。T1读取了一个字段,然后T2更新了该字段之后,T1再次读取同一个字段,值就不同了。
幻读(虚读):对于两个事务T1,T2。T1从一个表中读取一个字段时,T2在该表中插入了一些新的行。此时T1就会多出几行。

解决方法

数据库事务的隔离性:数据库系统必须具有隔离并发运行各个事务的能力,使它们不会相互影响,避免各种并发问题.
一个事务与其他事务隔离的程度称为隔离级别。数据库规定了多种事务隔离级别,不同隔离级别对应不同的干扰程度,隔离级别越高,数据一致性就越好,但并发性越弱.
通过设置隔离级别来解决并发问题

4、隔离级别

级别类型级别名称脏读不可重复读幻读
read uncommitted读未提交×××
read committed读已提交××
repeatable read可重复读×
serializable串行化

√表示:解决了这一问题;×则相反

实例演示

测试隔离级别为read uncommitted

1.打开命令行,进入mysql数据库,并查看数据库的隔离级别;

mysql8.0:select @@transaction_isolation;
其他版本自行百度
在这里插入图片描述
2.将隔离级别改为read uncommitted;
set session transaction isolation level read uncommitted;
在这里插入图片描述
3. 随意查看一个表(忽略里面的数据,我直接从copy老师给定数据库文件)(-_-)
在这里插入图片描述
4.开启一个事务并修改里面的任意一个值,不要提交事务
在这里插入图片描述
5.开启一个新的命令行,进入mysql数据库,并将隔离级别改为read uncommitted,查看修改后的表;
在这里插入图片描述
6.让第一个的命令行的事务回滚;并查看第二个命令行的beauty表;
在这里插入图片描述
在这里插入图片描述
我们可以看到beauty表中的数据有变回原来的数据了,注意:如果我们在第5步,也就是上一个事务没有回滚之前读取数据,这时我们读的数据就是脏数据

测试隔离级别为read committed

1.分别将两个命令行里的mysql隔离级别都改为read committed
在这里插入图片描述
2.查看beauty表中的数据
在这里插入图片描述
3.开启一个新事务,并修改表中的数据不要提交
在这里插入图片描述
4.在另一个命令行中查看beauty表
在这里插入图片描述
我们可以看到,这里我们读取的还是之前没有修改过的数据;因为read committed隔离级别下读取的是以提交的数据所以,read committed可以解决脏读的问题

注意:read committed并不能解决不可重复读的问题
因为这时,如果我们将第一个事务提交,第二个事务再次读取数据,则两次读的数据不一样
在这里插入图片描述

在这里插入图片描述

测试隔离级别为repeatable read

1.依上将隔离级别修改为repeatable read
在这里插入图片描述
2.开启事务,更改数据,另一个事务查看数据

第一个事务
在这里插入图片描述

第二个事务
在这里插入图片描述

我们可以看到这里解决了脏读和重复读的问题

接下来我们讨论一下幻读(虚读)

主要针对插入

session1session2
set autocommit=0;set autocommit=0;
select * from beauty;select * from beauty;
insert into beauty values(…);
commit;
update beauty set sex = ‘男’;
commit;

在这里插入图片描述
在这里插入图片描述
这里我们可以看到第一个事务执行
update beauty set sex = '男';
本应该影响12条记录,但是我们在执行update前,第二个事务执行了insert语句插入了一条数据;导致第一个事务出现了幻读;
所以repeatable read并不能解决幻读的问题

测试隔离级别为serializable

在这里插入图片描述
在这里插入图片描述
我们可以看到这里第二个事务在执行select语句时就进入了阻塞状态,无法取beauty表再进行任何操作(包括插入操作);
所以,serializable可以解决幻读的问题

各种数据库对事务隔离级别的支持

OracleMysql
READ UNCOMMITTED×
READ COMMITTED√(默认)
REPEATABLE READ×√(默认)
SERIALIZABLE
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值