MYSQL的事务隔离性

1.什么是事务的隔离性?
一个事务的执行过程中不能影响到其他事务的执行,即一个事务内部的操作及使用的数据对其他事务是隔离的,并发执行各个事务之间无不干扰。


2.为什么要设置事务的隔离性?

那我们就要知道不设置隔离性会产生什么影响?主要是以下几个问题:脏读不可重复读幻读(接下来会一一实讲解)


3.mysql针对上面产生的问题对应的设置不同的隔离级别来解决
在这里插入图片描述
4.演示之前我们先把事务自动提交关闭了,默认是开启(1)的,再创建一张student表,再开启两个窗口
查看命令:select @@autocommit;
在这里插入图片描述
修改命令:set autocommit=0;两个窗口都要执行
在这里插入图片描述
表数据
在这里插入图片描述

5.什么是脏读?

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

接下来我们来演示一下,首先把隔离级别设置为读未提交
命令set session transaction isolation level read uncommitted;(两个窗口都要执行)session是代表会话级别
在这里插入图片描述
开启事务begin(两个窗口都要执行)
在这里插入图片描述
第一个窗口执行更新语句update student set name = 'haha';
在这里插入图片描述
但是我们发现另外一个事务(窗口),读取到了第一个事务未提交的数据,这就是脏读
在这里插入图片描述
6.什么是不可重复读?

一个事务范围内两个相同的查询却返回了不同数据

在刚才的演示中,当我们rollback回滚时,此时第二个窗口所查到的数据又变回之前的了,所以这就是一个事务中两个相同的查询语句却返回了不同的数据
在这里插入图片描述
首先把隔离级别设置为读已提交
命令set session transaction isolation level read committed;(两个窗口都要执行)
在这里插入图片描述
首先我们需要知道读已提交这个隔离级别解决的是脏读问题,即不会读到别的事务未提交的数据,下图就证实了这个说法,第一个事务做出了更新操作update studnet set name = 'zhangsan' where id =1;,但是并未提交,所以第二个事务是读取不到的在这里插入图片描述
但是还是没有解决掉不可重复读的问题在这里插入图片描述7.什么是幻读?

第一个事务对一个表中的数据进行了修改。此时第二个事务进行查询并未发现第一个事务修改的数据,随后也修改这个表中的数据. 但是发现修改不了,就好象发生了幻觉一样

其实幻读不可重复读理论上是一样的,幻读是插入的应用场景,不可重复读是查询的应用场景

首先把隔离级别设置为可重复读
命令set session transaction isolation level repeatable read;(两个窗口都要执行)
在这里插入图片描述
开启事务,第一个窗口进行更新操作,发现第二个事务中两次一样的查询得到的结果是一样的,从而解决了不可重复读的问题
在这里插入图片描述
但是还是没有解决幻读的问题,第一个窗口执行插入id为4的数据,第二个窗口进行查询时发现数据只有三条,当想进行插入id为4 的数据的时候发现报Duplicate entry '4' for key 'PRIMARY',这就是幻读

在这里插入图片描述
第二个窗口插入id为5的数据的时候,是可以插入的,并且查询的时候还是没有发现id为4的数据,真的像幻觉一样
在这里插入图片描述
至此,mysql事务隔离性讲述的差不多了,串行化可以解决所有的问题,但是效率低,所有mysql默认的隔离级别是可重复读

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值