Mysql 更新相同数据问题

本文探讨了在MySQL中更新相同数据时的现象,通过实验验证了实际上MySQL采取了第三种策略,即认真执行了更新操作,尽管实际值未改变。在开启两个会话并进行更新操作时,发现数据行被锁定,且在可重复读隔离级别下,事务看不到其他事务的修改。通过查看InnoDB状态,确认了行被更新。结论是MySQL在遇到此类更新时确实执行了完整的更新流程。
摘要由CSDN通过智能技术生成

看了极客时间,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)"这个操作,该加锁的加锁,该更新的更新。
你觉得实际情况会是以上哪种呢?你可否⽤构造实验的⽅式,来证明你的结论?进⼀步地,可以思考⼀下&#

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值