![](https://saas.bk-cdn.com/t/28fa19a1-bd4e-468d-b51a-cc1195795049/u/e41e744f-8a62-49c8-9e5b-0b3866856d0c/1111640308615099.png)
![](https://saas.bk-cdn.com/t/28fa19a1-bd4e-468d-b51a-cc1195795049/u/e41e744f-8a62-49c8-9e5b-0b3866856d0c/2221640308641307.png)
![](https://saas.bk-cdn.com/t/28fa19a1-bd4e-468d-b51a-cc1195795049/u/e41e744f-8a62-49c8-9e5b-0b3866856d0c/3331640308645781.png)
mysql事务隔离级别实验
一、实验数据:
建表语句:
CREATE TABLE `isolation` (`id` int(11) NOT NULL,`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_croatian_ci DEFAULT NULL,PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
创建表名为:isolation的表,其中有两个字段,一个 id ,一个 name
原始数据:
insert into ISOLATION values(1,'name1'),(2,'name2'),(3,'name3');
插入三条记录。
二、准备:
分别打开两个mysql客户端A 、B
查看当前客户端隔离级别
SELECT @@tx_isolation
![](https://img2018.cnblogs.com/blog/1364432/201906/1364432-20190606143448043-997085436.png)
mysql InnoDB默认隔离级别为可重复读。
设置B客户端不自动提交:
查看自动提交设置:
show session variables like 'autocommit';
![](https://img2018.cnblogs.com/blog/1364432/201906/1364432-20190606144307061-765156740.png)
mysql InnoDB默认自动提交。
设置不自动提交:
set session autocommit=0;
![](https://img2018.cnblogs.com/blog/1364432/201906/1364432-20190606144545306-1573397097.png)
客户端设置不自动提交事物成功。
一、脏读实验开始---------------------------------------
设置A的隔离级别为读未提交:
set session transaction isolation level read uncommitted;
客户端B启动一个事物
![](https://img2018.cnblogs.com/blog/1364432/201906/1364432-20190606150219995-836819458.png)
![](https://img2018.cnblogs.com/blog/1364432/201906/1364432-20190606151338164-93079420.png)
发现update的数据没有提交就读到了,回滚之后导致脏读。
![](https://img2018.cnblogs.com/blog/1364432/201906/1364432-20190606151837960-1481670969.png)
发现insert的数据没有提交就读到了,回滚之后导致脏读。
![](https://img2018.cnblogs.com/blog/1364432/201906/1364432-20190606152531547-165480662.png)
发现delete的数据没有提交就读到了,回滚之后导致脏读。
脏读实验结束---------------------------------------
结论,脏读会读没有提交的update insert delete。
读已提交实验开始---------------------------------------
设置A的隔离级别为读已提交:
set session transaction isolation level read committed;
![](https://img2018.cnblogs.com/blog/1364432/201906/1364432-20190606153404575-969741243.png)
update的时候------>>>发现解决了脏读,但是在一个事物里面,两次查询的结果不一致,即解决不了重复读的问题
![](https://img2018.cnblogs.com/blog/1364432/201906/1364432-20190606153830228-1112852503.png)
insert的时候------>>>发现解决了脏读,但是在一个事物里面,两次查询的结果不一致,即解决不了重复读的问题
![](https://img2018.cnblogs.com/blog/1364432/201906/1364432-20190606154403958-453931981.png)
delete的时候------>>>发现解决了脏读,但是在一个事物里面,两次查询的结果不一致,即解决不了重复读的问题
读已提交实验结束---------------------------------------
结论:解决了脏读,但是一个事物里面,同一个查询结果不一致,不能解决重复读的问题。
可重复读实验开始---------------------------------------
数据重新清理一下:
![](https://img2018.cnblogs.com/blog/1364432/201906/1364432-20190606160046342-1950956003.png)
update的时候------>>>在一个事物里面,两次查询直间,读不到另外事物提交的内容,只有提交当前事物,新启事物查询的时候才能查到更新的,即解决不了重复读的问题
![](https://img2018.cnblogs.com/blog/1364432/201906/1364432-20190606160750721-764993195.png)
delete的时候------>>>在一个事物里面,两次查询直间,读不到另外事物提交的内容,只有提交当前事物,新启事物查询的时候才能查到更新的,即解决不了重复读的问题
![](https://img2018.cnblogs.com/blog/1364432/201906/1364432-20190606161136629-1457657214.png)
insert的时候------>>>在一个事物里面,两次查询直间,读不到另外事物提交的内容,只有提交当前事物,新启事物查询的时候才能查到更新的,即解决不了重复读的问题
可重复读实验结束---------------------------------------
结论:解决了脏读,可重复读,好像mysql 5.7.26在可重复读隔离级别解决了 幻想读的现象(猜测,还没太明白)。
串行化读实验开始---------------------------------------
![](https://img2018.cnblogs.com/blog/1364432/201906/1364432-20190606171112403-983337554.png)
串行化读实验结束--------------------------------------
结论:串行化后,当一个事物没有提交,另外的事物不能修改对数据进行(update,insert,delete操作)。
我的隔离操作直接把solyog搞崩了。
![](https://saas.bk-cdn.com/t/28fa19a1-bd4e-468d-b51a-cc1195795049/u/e41e744f-8a62-49c8-9e5b-0b3866856d0c/image1640310771095.png)