测试你对MySQL事务与隔离级别的理解的一道题
来源:互联网 发布:超级兔子优化王 编辑:程序博客网 时间:2024/05/09 06:05
之前写过一篇《MySQL InnoDB 四种事务隔离级别 与脏读、可重复读、幻读》
http://blog.csdn.net/seven_3306/article/details/27085275
这是我自己琢磨出来的一道关于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,则为5SELECT a FROM t; 结果一、如果session B锁等待超时,则为1
二、如果session B未超时,且session A提交事务则为6
三、如果session A被rollback,则为5)
思考,换成其它事务隔离级别,那么结果又是什么?
http://blog.csdn.net/seven_3306/article/details/27085275
这是我自己琢磨出来的一道关于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,则为5SELECT a FROM t; 结果一、如果session B锁等待超时,则为1
二、如果session B未超时,且session A提交事务则为6
三、如果session A被rollback,则为5)
思考,换成其它事务隔离级别,那么结果又是什么?
0 0
- 测试你对MySQL事务与隔离级别的理解的一道题
- 测试Mysql的事务隔离隔离级别
- Mysql中事务隔离级别与binlog_format的一点理解
- 事务隔离级别的理解
- 事务的隔离级别理解
- MySQL的事务隔离级别
- mysql的事务隔离级别
- Mysql的事务隔离级别
- MySQL事务的隔离级别
- mysql 的事务隔离级别
- MySql 的事务隔离级别
- MySQL的事务隔离级别
- mysql的事务隔离级别
- mySql的事务隔离级别
- mysql的事务隔离级别
- MySQL的事务隔离级别
- Mysql事务的隔离级别
- MySQL事务的隔离级别
- Android ScrollView妙用(scrolling tricks详解)
- Framebuffer and Renderbuffer Objects
- 单件模式的相关概念
- nginx 配置ajax跨域访问php api
- HTML5实现随机生成小球并向上移动
- 测试你对MySQL事务与隔离级别的理解的一道题
- scala起步---安装scala eclipse插件 安装scala简单示例
- js中取绝对值的2种方法!
- js将object转为字符串
- tmx格式
- 杨辉三角
- 超链接锚点的使用
- QC运行测试集合时常见问题
- 软件求职_API