视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
测试你对MySQL事务与隔离级别的理解的一道题_MySQL
2020-11-09 19:47:44 责编:小采
文档
这是我自己琢磨出来的一道关于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)



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

下载本文
显示全文
专题