update影響行數使用不當造成的bug


業務系統中,使用update語句更新數據是再正常不過的場景,我們也經常通過update更新的行數,來做一些業務判斷,類似下面的偽代碼:(mybatis + mysql 場景)

if (xxxMapper.updateByPrimaryKeySelective(entity)>0){
   //更新成功,做其它業務處理
}

但是這里有一個坑,mysql中update影響行數>0是有條件的,假如有一張表:

里面只有一條記錄(ID=1),我們用update更新一把ID=1的這條記錄

這一行成功更新,影響行數為1,理所當然,然后把這條update語句再執行一次:

這時候,返回的影響行數為0,也就是說,當待更新的記錄與原始記錄舊值相同時,mysql其實並不會做任何更新。換言之,如果上游傳過來的數據,與數據庫本身的舊值相等,沒有變化時,update語句影響行數為0。這與另一種場景:"更新一條並不存在的記錄,影響行數返回0" 無法區分。

結論:不要使用update語句的影響行數做重要的業務判斷!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM