【312期】天坑!常见的 update 语句很容易造成 Bug 问题

点击上方“Java精选”,选择“设为星标”

别问别人为什么,多问自己凭什么!

下方有惊喜,留言必回,有问必答!

每一天进步一点点,是成功的开始...

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

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

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

7eb25ae3464caac8d6f8b13df8a68886.png

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

7717980c2a49ed3d8b13d0a7bea93067.png
另外,推荐下Spring cloud的通用微服务开源项目:
https://gitee.com/yoodb/jingxuan-springcloud

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

eefe4aa4fc00b8e5d5f3162c150e9445.png

这时候,返回的影响行数为0,也就是说,当待更新的记录与原始记录旧值相同时,mysql其实并不会做任何更新。 

另外,推荐下Spring boot的通用后台管理系统开源项目:
https://gitee.com/yoodb/jing-xuan

换言之,如果上游传过来的数据,与数据库本身的旧值相等,没有变化时,update语句影响行数为0。这与另一种场景:"更新一条并不存在的记录,影响行数返回0" 无法区分。

9aa9654c36726463da724c1e642ffa81.png

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

作者:杨俊明
https://www.cnblogs.com/yjmyzz/p/13562182.html

公众号“Java精选”所发表内容注明来源的,版权归原出处所有(无法查证版权的或者未注明出处的均来自网络,系转载,转载的目的在于传递更多信息,版权属于原作者。如有侵权,请联系,笔者会第一时间删除处理!

------ THE END ------

ec63c1c821241cbdaa0176857e06f12d.png精品资料,超赞福利!30fff81c5580485bcfacf51e1ef2c878.png

☆ 主流Java进阶技术(学习资料分享)

>Java精选面试题<
3000+ 道各类技术面试题在线刷,最新、最全 Java 面试题!

f6ed3ca4f1d332983d7e2bdab18417a3.png

8d13923f181622ce3d6c1ce48f97b899.png

期往精选  点击标题可跳转

【303期】SpringBoot + Redis 实现搜索栏热搜、不雅文字过滤功能

【304期】全文搜索引擎 Elasticsearch,这篇文章给讲透了!

【305期】Spring Cloud 优雅下线+灰度发布

【306期】微服务 Spring Cloud 架构实现分布式日志采集方案

【307期】从实现原理来讲,Nacos 为什么这么强?

【308期】Java 实现 10 万,并发去重,优雅地处理重复请求!

【309期】Spring Bean 容器启动耗时统计分析

【310期】Spring Cloud 分布式 WebSocket 集群解决方案

【311期】4种方法,实现多线程按照指定顺序执行

453e09af19fc7d43e0e4342e3025832c.png 技术交流群!da173d33602011138224ac50da11e7fa.png

最近有很多人问,有没有读者交流群!想知道如何加入?方式很简单,兴趣相投的朋友,只需要点击下方卡片,回复“加群”,即可无套路入交流群!

文章有帮助的话,在看,转发吧!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值