好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

MySQL事务测试

 

 

 

 --  查看是否是自动提交 1表示开启,0表示关闭 
 select   @@autocommit  ;
  --  设置关闭 
 set  autocommit  =   0 ;

 

 

2.数据准备

 --  创建数据库 
 create   database   tran  ;
  --  切换数据库 两个窗口都执行 
 use   tran  ;
  --  准备数据 
  create   table  psn(id  int   primary   key ,name  varchar ( 10 )) engine =  innodb;
  --  插入数据 
 insert   into  psn  values ( 1 , ‘  zhangsan  ‘  );
  insert   into  psn  values ( 2 , ‘  lisi  ‘  );
  insert   into  psn  values ( 3 , ‘  wangwu  ‘  );
  commit ;

 

这个我们开两个会话窗口进行测试。分别为a、b两个窗口。

 

3.测试1: read uncommitted(读未提交)

 --  a: 
 set  session  transaction   isolation   level   read   uncommitted  ;
  --  b: 
 set  session  transaction   isolation   level   read   uncommitted ;

 --  a:  
--  开始事务 
start  transaction  ;
  select   *   from   psn;
  update  psn  set  name =  ‘  zhaoliu  ‘  ;
selecet   *   from   psn
  --  b: 
start  transaction  ;
  select   *   from  psn;

 

 

b读取的结果zhaoliu。产生脏读,因为a事务没有commit,读取到了不存在的数据

 --  a:  
--  提交事务 
 commit  ;
  --  b: 
 select   *   from  psn;

b读取的数据是zhaoliu,因为a事务已经commit,数据永久的被修改。

 

4.测试2:read committed

 --  a: 
 set  session  transaction   isolation   level   read   committed  ;
start   transaction  ;
  select   *   from   psn;
  --  b: 
 set  session  transaction   isolation   level   read   committed  ;
start   transaction  ;
  select   *   from  psn;

执行到这里两个窗口的数据是一致的。

 

 --  a: 
 update  psn  set  name  =  ‘  tianqi  ‘   where  id  =   1  ;
  select   *   from   psn;
  --  b: 
 select   *   from  psn;

执行到此处两个窗口的数据不一致,b窗口中读取不到更新的数据

 --  a: 
 commit  ;
  select   *   from   psn;
  --  b: 
 select   *   from  psn;

 

 

5.测试3:repeatable read

 --  a: 
 set  session  transaction   isolation   level   repeatable   read  ;
start   transaction  ;
  select   *   from   psn;
  --  b: 
 set  session  transaction   isolation   level   repeatable   read  ;
start   transaction  ;
  select   *   from   psn;
  --  此时两个窗口的数据是一致的 
 ?
  --  a: 
 insert   into  psn  values ( 4 , ‘  zhouba  ‘  );
  commit  ;
  select   *   from   psn;
?
  --  b: 
 select   *   from   psn;
  --  读取不到添加的数据 
 insert   into  psn  values ( 4 , ‘  zhouba  ‘  );
  --  报错,无法插入数据  
--  此时发现读取不到数据,但是在插入的时候不允许插入,出现了幻读,设置更高级别的隔离级别即可解决 

 

 

6.测试事务

 --  事务包含四个隔离级别:从上往下,隔离级别越来越高,意味着数据越来越安全 
 read   uncommitted ;    --  读未提交 
 read  commited;       --  读已提交 
 repeatable   read ;     --  可重复读 
 serializable          --  序列化执行,串行执行  
/*  
  产生数据不一致的情况:
  脏读
  不可重复读
  幻读
  */ 

 

四种隔离级别会造成的异常情况:

隔离级别 异常情况 异常情况 异常情况 读未提交 脏读 不可重复读 幻读 读已提交   不可重复读 幻读 可重复读     幻读 序列化      

MySQL事务测试

标签:查看   varchar   level   src   不可重复读   ade   inf   zha   table   

查看更多关于MySQL事务测试的详细内容...

  阅读:33次