MySQL 测试Isolation

发布时间 2023-06-02 08:17:45作者: zno2

 

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隔离等级可以避免幻读