这是我自己琢磨出来的一道关于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) 思考,换成其它事务隔离级别,那么结果又是什么?查看更多关于测试你对MySQL事务与隔离级别的理解的一道题 -的详细内容...
声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://www.haodehen.cn/did5345