看了极客时间,Mysql 45讲,老师留了一个问题,感觉很有意思,问题如下:
我们创建了⼀个简单的表t,并插⼊⼀⾏,然后对这⼀⾏做修改。
mysql> CREATE TABLE `t` (
`id` int(11) NOT NULL primary key auto_increment,
`a` int(11) DEFAULT NULL
) ENGINE=InnoDB;
insert into t values(1,2);
这时候,表t⾥有唯⼀的⼀⾏数据(1,2)。假设,我现在要执⾏:mysql> update t set a=2 where id=1;
你会看到这样的结果:
结果显示,匹配(rows matched)了⼀⾏,修改(Changed)了0⾏。
仅从现象上看,MySQL内部在处理这个命令的时候,可以有以下三种选择:1. 更新都是先读后写的,MySQL读出数据,发现a的值本来就是2,不更新,直接返回,执⾏结束;
2. MySQL调⽤了InnoDB引擎提供的“修改为(1,2)”这个接⼝,但是引擎发现值与原来相同,不更新,直接返回;
3. InnoDB认真执⾏了“把这个值修改成(1,2)"这个操作,该加锁的加锁,该更新的更新。
你觉得实际情况会是以上哪种呢?你可否⽤构造实验的⽅式,来证明你的结论?进⼀步地,可以思考⼀下&#