巨坑,update語句使用不當(dāng)造成的bug
點(diǎn)擊關(guān)注公眾號(hào),Java干貨及時(shí)送達(dá)
作者:菩提樹下的楊過
來源:www.cnblogs.com/yjmyzz/p/13562182.html
類似下面的偽代碼:(mybatis + mysql 場(chǎng)景)
if?(xxxMapper.updateByPrimaryKeySelective(entity)>0){
???//更新成功,做其它業(yè)務(wù)處理
}踩坑
但是這里有一個(gè)坑,mysql 中 update 影響行數(shù) >0 是有條件的,假如有一張表:

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

這一行成功更新,影響行數(shù)為 1,理所當(dāng)然,然后把這條 update 語句再執(zhí)行一次:

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

結(jié)論
不要使用 update 語句的影響行數(shù)做重要的業(yè)務(wù)判斷!
? ? ?
往 期 推 薦
1、五年官司終敗訴,萬億爬蟲大軍蠢蠢欲動(dòng) 2、程序員最硬大佬,你絕對(duì)想不到!!! 3、IntelliJ IDEA快捷鍵大全 + 動(dòng)圖演示 4、打不過就加入?微軟強(qiáng)推“親兒子”上位,還是中國(guó)特供版 5、微信翻譯,快把上海老外搞瘋了 點(diǎn)分享
點(diǎn)收藏
點(diǎn)點(diǎn)贊
點(diǎn)在看
評(píng)論
圖片
表情





