MySQL 测试Isolation
CREATE TABLE foo ( `name` VARCHAR (20) NULL DEFAULT NULL ) ENGINE = INNODB;
insert foo values ('张三');
设置隔离级别
#set SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; #set SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED; #set SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ; #set SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE; show variables where Variable_name like '%isolation%';
一、脏读
脏读是读取了其他事务修改但没有提交的内容(不论是否回滚或二次修改)。
该隔离级别是约束该级别事务T0读取数据的行为,不论其他事务隔离级别如何,只要其他事务修改数据且未提交,T0均可脏读。
脏读可以数据一致,但是有不一致的风险
测试:
T0 设置READ UNCOMMITTED/其他,T0表现是可脏读/不可脏读
切换其他事务隔离级别,并无影响上述结果。
说明:提升T0隔离级别后可避免脏读
二、不可重复读
不可重复读是指事务二次检索前,其他事务修改了目标数据,导致T0二次检索和之前的结果不一致。
说明:提升T0隔离级别后可避免不可重复读
三、幻读
幻读如果只是其他事务插入和更新、删除数据,不会影响自己
但是如果T0执行了update(不含insert,delete ) 且where条件含T1新增的数据,则会发生幻读
即T0更新了其他事务新增的数据,T0就会发生幻读
说明:提升T0隔离等级可以避免幻读