1.查看 SELECT @@tx_isolation ;
或者:show variables like "%isolation%";
2.设置
1)read uncommitted : 读取尚未提交的数据 :哪个问题都不能解决
2)read committed:读取已经提交的数据 :可以解决脏读 ,但是出现不可重复读---- oracle默认的
3)repeatable read:重读读取:可以解决脏读 和 不可重复读 ---mysql默认的
4)serializable:串行化:可以解决 脏读 不可重复读 和 虚读---相当于锁表
设置mysql的隔离级别:set session transaction isolation level 设置事务隔离级别。
事务隔离级别会产生的问题:
1、脏读(dirty read):当一个事务读取另一个事务尚未提交的修改时,产生脏读。
2、不可重复读(nonrepeatable read):同一查询在同一事务中多次进行,在此期间,由于其他事务提交了对数据的修改或删除,每次返回不同的结果。
3、幻读(phantom read):同一查询在同一事务中多次进行,由于其他提交事务所做的插入操作,虽然查询条件相同,每次返回的结果集却不同。
测试的时候,要先确定mysql是否是自动提交,autocommit要为 OFF。
show variables like "%commit%";
要在开启事务(start transaction;)前设置隔离级别
测试:select * from emp where empno='7369';
1、开启一个事务,对empno='7369'的 sal 增加200,但是未提交事务
不同事务隔离级别下,开启事务,执行查询 select * from emp where empno='7369';
read uncommitted sal=1200 产生了脏读,读取到另一个事务未提交的数据。
read committed sal=1000
repeatable read sal=1000
2、将事务first的update进行提交,commit
read uncommitted sal=1200 产生了不可重复读,同一个事务执行查询,查到了另一个事务提交的数据。
read committed sal=1200 产生了不可重复读,同一个事务里面执行查询,查到了另一个事务提交的数据。
repeatable read sal=1000 解决了不可重复读,同一个事务里面多次查询,不能查到另一个事务提交的修改的数据,但是可以读到插入insert的数据。
repeatable read 再重新开启一个事务查询,这下sql=1200