今天测试同学提出一个很诡异的bug,大致内容为在富文本输入框中频繁粘贴同一张图片的时候,会出现文件上传失败的问题,顺着链路,我发现是文件服务那边的锅,然而可以解决问题的人因为各种原因解决不了,我只好去拉代码自己去看了。发现文件上传接口在上传一个之前已经上传过的文件时,他会重新获取文件信息,然后把表中已存在的这条数据(文件信息)再重新修改一遍。发现其中有一个update_time,里面存的是时间戳。因为文件上传失败的问题只有在频繁上传同一个文件时才会出现,所以我觉得和这个sql有关系,其次,同一个文件,文件信息很少概率会发生变化,所以这个修改语句里面的字段只有update_time是变量。顺藤摸瓜发现了这个问题。
问题就出现在了当执行的update sql中,set后面的值,假如与数据库中的值一样,在默认情况下,受影响的行数为0!!!
内容如下:
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进行判断的,因此才会引出今天这个问题。
本文为wxz原创文章,转载无需和我联系,但请注明来自wxz博客https://xingzhen.wang
最新评论