> 데이터 베이스 > MySQL 튜토리얼 > 测试你对MySQL事务与隔离级别的理解的一道题_MySQL

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

WBOY
풀어 주다: 2016-06-01 13:01:18
원래의
942명이 탐색했습니다.

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



思考,换成其它事务隔离级别,那么结果又是什么?
관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿