首页 > 数据库 > 数据库开发技术 > MySQL里那些“一眼bug”的案例们(二)
先在8.0.39复现一下这个bug。
CREATE TABLE `t` (`id` int(11) NOT NULL,`c` int(11) DEFAULT NULL,PRIMARY KEY (`id`)) ENGINE=InnoDB;insert into t values(1,1),(2,2),(3,3),(4,4);//构造小表,表里只有4行
delimiter ;;create procedure udata3()begindeclare i int;set i=1;while(i<=50000) doupdate t set c=c+1 where id=3;set i=i+1;end while;end;;delimiter ;//准备一个存储过程,对id=3这一行做5万次更新
| session1 | session2 |
|
begin; select * from t where id=4; |
|
|
call udata3(); //调用存储过程,把id=3这一行的undo 撑起来 |
|
|
select * from t limit 1; //耗时1秒,太慢了 |
因为id=3这一行要满足RR隔离级别,需要读大量的undolog,如果读到id=3这一行,1秒是合理的。
但是这个语句明明只需要limit1,犯不着读到id=3,本应该很快的。
那这是个bug还是feature呢?
为了把后路堵掉,拿5.6版本对比一下, 很快。
select * from t limit 1;//1 row in set(0.00 sec)
原文作者:丁奇3306;如有侵权,请联系管理员删除。