在上周五的接口壓力測試中搪搏,編寫的一個查詢課程詳情出現(xiàn)了失敗辆它,查看后臺日志發(fā)現(xiàn)是MybatisPlus報錯榜晦,大致錯誤是:selectOne but found 2玲献。老司機一看就明白是數(shù)據(jù)庫包含有多條重復(fù)數(shù)據(jù)。
經(jīng)過對數(shù)據(jù)庫有針對性的排查才漆,臟數(shù)據(jù)很快被清理出來了牛曹。但是問題來了,究竟是什么原因造成臟數(shù)據(jù)的呢醇滥?我仔細(xì)排查了接口的相關(guān)代碼黎比,大致邏輯為:首先從記錄表查詢課程記錄,如果不存在鸳玩,則插入阅虫,否則就更新。相關(guān)偽代碼如下:
//查詢是否存在課程記錄
RecordDo recordDo = recordMapper.selectOne(...);
//如果記錄不存在
if(recordDo!=null){
//插入操作
insert();
}
else{
//更新操作
updateById();
}
我相信很多同學(xué)在業(yè)務(wù)中都寫過類似的代碼怀喉,這是一個十分常見的case书妻。在日常使用過程中也按照預(yù)期的運行了,然而bug總是悄悄的到來躬拢,不知不覺數(shù)據(jù)庫中就莫名多了一條臟數(shù)據(jù)躲履。最開始的時候以為是之前代碼沒有完善,導(dǎo)致臟數(shù)據(jù)沒有清理聊闯,然而同樣的情況在后期再次出現(xiàn)了工猜。憑借直覺應(yīng)該是并發(fā)造成的,但是手動模擬并發(fā)比較麻煩菱蔬,而常用的接口測試工具postMan似乎也是串行篷帅,于是,jmeter出現(xiàn)在了我的視線中拴泌。
jmeter是依據(jù)Java編寫的魏身,而最新的要求JDK1.8。這條要求相信對于大家都是十分easy蚪腐。
- 首先進(jìn)入jmeter官網(wǎng):https://jmeter.apache.org/download_jmeter.cgi下載箭昵。
- 進(jìn)入bin目錄
- 執(zhí)行
sh jmeter
命令。
最后啟動最上方綠色三角即可進(jìn)行測試回季。
很快家制,bug無處遁形,我能清晰的觀看到在簡單的并發(fā)操作下泡一,同時插入了兩條一樣的數(shù)據(jù)颤殴。當(dāng)然,如果解決并發(fā)下重復(fù)提交的問題鼻忠,這就涉及到分布式鎖了涵但,這并不在本章節(jié)的范圍之類了。本次僅僅是通過jmeter模擬并發(fā)請求來復(fù)現(xiàn)bug,如果你的項目也需要用到并發(fā)測試贤笆,那么我強烈推薦你使用jmeter蝇棉,簡單實用讨阻。