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默认的隔离级别是可重复读