mysql update受影响的行数

update时受影响行数产生的问题

今天测试同学提出一个很诡异的bug,大致内容为在富文本输入框中频繁粘贴同一张图片的时候,会出现文件上传失败的问题,顺着链路,我发现是文件服务那边的锅,然而可以解决问题的人因为各种原因解决不了,我只好去拉代码自己去看了。发现文件上传接口在上传一个之前已经上传过的文件时,他会重新获取文件信息,然后把表中已存在的这条数据(文件信息)再重新修改一遍。发现其中有一个update_time,里面存的是时间戳。因为文件上传失败的问题只有在频繁上传同一个文件时才会出现,所以我觉得和这个sql有关系,其次,同一个文件,文件信息很少概率会发生变化,所以这个修改语句里面的字段只有update_time是变量。顺藤摸瓜发现了这个问题。

上面文字过多,懒的看的可以看这个图,一目了然

问题就出现在了当执行的update sql中,set后面的值,假如与数据库中的值一样,在默认情况下,受影响的行数为0!!!

这个注意点在mysql官方文档中已经指出了 这里是官方文档

内容如下:

For UPDATE statements, the affected-rows value by default is the number of rows actually changed. If you specify the CLIENT_FOUND_ROWS flag to mysql_real_connect() when connecting to mysqld, the affected-rows value is the number of rows “found”; that is, matched by the WHERE clause.

翻译结果:(以下翻译插件使用的是我用go开发的命令行翻译工具,代码地址gitte

总结:

文件服务使用的ORM引擎是xorm,update时返回两个参数,第一个参数是返回受影响的行数,第二个参数是返回error。然而写这个代码的人,在判断sql是否执行成功时,是通过判断第一个参数是否不等于0进行判断的,因此才会引出今天这个问题。

王兴振博客
请先登录后发表评论
  • latest comments
  • 总共0条评论