首页 > 代码库 > 测试你对MySQL事务与隔离级别的理解的一道题

测试你对MySQL事务与隔离级别的理解的一道题

之前写过一篇《MySQL InnoDB 四种事务隔离级别 与脏读、可重复读、幻读》

http://blog.csdn.net/seven_3306/article/details/27085275

这是我自己琢磨出来的一道关于MySQL事务和隔离级别的题目,请填写问号部分的内容:

如果你能正确的说明出如下结果,那么你应该对MySQL事物和隔离级别有一定的认识了。


如果不是,那么可能你并不理解MySQL的事务和隔离级别。

另外这道题可以帮你理解为什么有的时候会出现这个问题:
ERROR 1205 (HY000): Lock wait timeout exceeded;    try restarting transaction


理解了这个错误的原因,就可以解决这个问题了。



MySQL 数据库有表 
create table t(a int)engine=innodb,charset=utf8;
insert into t(a)values(0);
MySQL在两个session中按照如下顺序执行如下命令:
session  Asession B
  
set session transaction  isolation level read committed; 
SET AUTOCOMMIT=0;set session transaction isolation level read committed;
 SET AUTOCOMMIT=0;
SELECT a FROM t; 
结果:0 
  
 SELECT a FROM t;
 结果:0
  
  
UPDATE t SET a = a+1; 
SELECT a from t; 
结果:? 
  
  
 SELECT a from t;
 结果:?
  
 UPDATE t set a=a+5;

结果:
   
  
  
COMMIT;(ROLLBACK) 
 SELECT a FROM t;
 结果:? (如果session  A被rollback,则为?)
  
 COMMIT
  
 SELECT a FROM t;
 结果:?(如果session  A被rollback,则为?)
SELECT a FROM t; 
结果:?(如果session A被rollback,则为?) 




结果是:

session  Asession B
  
set session transaction  isolation level read committed; 
SET AUTOCOMMIT=0;set session transaction isolation level read committed;
 SET AUTOCOMMIT=0;
SELECT a FROM t; 
结果:0 
  
 SELECT a FROM t;
 结果:0
  
  
UPDATE t SET a = a+1; 
SELECT a from t; 
结果:1 
  
  
 SELECT a from t;
 结果:0
  
 UPDATE t set a=a+5;
 结果:被阻塞住了,再等待session  A的事务提交,也就是等待session A释放锁
    一、如果session A超过一定时间没有释放锁(提交事务),
    则session B因锁等待超时:ERROR 1205 (HY000): Lock wait timeout exceeded; 
    try restarting transaction
    2、如果session A在session B锁等待超时前提交了事务,则session B执行update a =a+1;
    Innodb锁等待时间为:show variables like ‘%innodb_lock_wait_timeout%‘;(Global,  Session级别)
    3、如果session A在session B锁等待超时前执行了rollback,则session B执行update a=a+1;
   
  
  
COMMIT;(ROLLBACK) 
 SELECT a FROM t;
 结果:(一、报错。 二、6  三、如果session A被rollback,则为5)
  
 COMMIT
  
 SELECT a FROM t;
 结果:(一、报错。 二、6  三、如果session A被rollback,则为5
SELECT a FROM t; 
结果一、如果session B锁等待超时,则为1 
    二、如果session B未超时,且session A提交事务则为6 
     三、如果session A被rollback,则为5)
 



思考,换成其它事务隔离级别,那么结果又是什么?


测试你对MySQL事务与隔离级别的理解的一道题