Home > Database > Mysql Tutorial > 测试你对MySQL事务与隔离级别的理解的一道题_MySQL

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

WBOY
Release: 2016-06-01 13:01:18
Original
942 people have browsed it

这是我自己琢磨出来的一道关于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 A session 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 A session 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)
 



思考,换成其它事务隔离级别,那么结果又是什么?
Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template