巨坑,update语句使用不当造成的bug!


文章来源:http://b.nxw.so/1UPgqf

目录

  • 背景

  • 踩坑

  • 结论

背景

业务系统中,使用 update 语句更新数据是再正常不过的场景,我们也经常通过 update 更新的行数,来做一些业务判断。

类似下面的伪代码:(mybatis + mysql 场景)

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

踩坑

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

e073cfca90bb06eb84e91b065cdd6b11.png

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

ce4b0c527c8ff82ae806a39b82a06a0e.png

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

8595073f898e3d08c2ac6b108d8d50cd.png

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

换言之,如果上游传过来的数据,与数据库本身的旧值相等,没有变化时,update 语句影响行数为 0。

这与另一种场景:"更新一条并不存在的记录,影响行数返回 0"无法区分。

bcd8daf7b2b6716ac7f7fddba1197797.png

结论

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

-------------  END  -------------

扫码免费获取600+页石杉老师原创精品文章汇总PDF

ba49ab6bad5da6ad5119f3b43c1ff748.png

5423679512868bcd5ec59c725e964965.gif

原创技术文章汇总

e61ff2d6d990e879db4cac5ff8152f38.png

73701ba2a196c87565b28fe3b37efc92.png

点个在看你最好看

7bf0c80403eb9a10c4061afc48e91bf2.png

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值