巨坑,常见的 update 语句很容易造成Bug

本文揭示了mysql中update语句影响行数为0的特殊情况,当旧值与新值相同时不会实际更新数据。作者建议避免依赖update语句的行数作为关键业务判断依据,并提供了实例和源码解析。

点击上方“芋道源码”,选择“设为星标

管她前浪,还是后浪?

能浪的浪,才是好浪!

每天 10:33 更新文章,每天掉亿点点头发...

源码精品专栏

 

来源:cnblogs.com/yjmyzz/

p/13562182.html

8c86b30777131027da724dd1a20495a6.png


业务系统中,使用update语句更新数据是再正常不过的场景,我们也经常通过update更新的行数,来做一些业务判断,类似下面的伪代码:(mybatis + mysql 场景)

if (xxxMapper.updateByPrimaryKeySelective(entity)>0){
        //更新成功,做其它业务处理
        }

但是这里有一个坑,mysql中update影响行数>0是有条件的,假如有一张表:

1066315f1ad474c423e48fb31dd9c7c9.png

里面只有一条记录(ID=1),我们用update更新一把ID=1的这条记录

a6df7eb10d543d3f21a1448afce0c9bc.png

这一行成功更新,影响行数为1,理所当然,然后把这条update语句再执行一次:

06925121b2a0b2a38047947fbb7b6450.png

这时候,返回的影响行数为0,也就是说,当待更新的记录与原始记录旧值相同时,mysql其实并不会做任何更新。 换言之,如果上游传过来的数据,与数据库本身的旧值相等,没有变化时,update语句影响行数为0。这与另一种场景:"更新一条并不存在的记录,影响行数返回0" 无法区分。

6b28542d30ff668b9ad3d1bb008ef08e.png

结论:不要使用update语句的影响行数做重要的业务判断!



欢迎加入我的知识星球,一起探讨架构,交流源码。加入方式,长按下方二维码噢

5b9f933d567c20c844809eec7661f9ad.png

已在知识星球更新源码解析如下:

a8f5d26c08deee3ae58ee6a01b290c62.png

42f379be3be5baf3eea55a373226efe2.png

fe3dd262ba107965b8a7f479c538dcde.png

a1717134835d1bec9fb75bc3e600ec97.png

最近更新《芋道 SpringBoot 2.X 入门》系列,已经 101 余篇,覆盖了 MyBatis、Redis、MongoDB、ES、分库分表、读写分离、SpringMVC、Webflux、权限、WebSocket、Dubbo、RabbitMQ、RocketMQ、Kafka、性能测试等等内容。

提供近 3W 行代码的 SpringBoot 示例,以及超 4W 行代码的电商微服务项目。

获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。

文章有帮助的话,在看,转发吧。
谢谢支持哟 (*^__^*)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值