1688額度中心并發(fā)交易場景下鎖機(jī)制問題
BUG標(biāo)題:
事務(wù)處理過程中數(shù)據(jù)加鎖不合理,導(dǎo)致同一數(shù)據(jù)源在交易過程中被其他交易改變
BUG影響:
1688極速到賬、賬期支付等場景下并發(fā)下單失敗或金額占用不準(zhǔn)確現(xiàn)象,造成擔(dān)保方金額虧損
BUG發(fā)現(xiàn)過程:
1)前期參與開發(fā)代碼review,梳理1688極速到賬、賬期支付等場景事務(wù)處理過程和鎖使用機(jī)制,識別代碼風(fēng)險點;
2)測試設(shè)計階段:針對性地設(shè)計各種交易復(fù)雜場景高并發(fā)壓測;
3)測試過程中:編寫數(shù)據(jù)校驗?zāi)_本,在上億條日志中檢查每筆交易訂單正確性,并找到必現(xiàn)條件;
原因為:交易過程中要用到的數(shù)據(jù)源被其他買家與該賣家交易時改變,導(dǎo)致失敗卻沒有進(jìn)行回滾,必現(xiàn)條件如下圖所示:
BUG解決方法:
在數(shù)據(jù)源被鎖住的代碼里再次添加查詢剩余額度代碼后再進(jìn)行金額占用,并保證失敗后能進(jìn)行數(shù)據(jù)回滾(注:第一次查詢剩余額度目的是查詢需要用到幾種授信源和各自的剩余金額進(jìn)行數(shù)據(jù)鎖定,開發(fā)認(rèn)為在查詢和數(shù)據(jù)鎖定之間時間極短不可能發(fā)生改變,故在鎖內(nèi)未加入再次查詢節(jié)省性能開銷),同時在回歸過程中評估修改影響,注意鎖內(nèi)操作變多帶來的接口性能下降問題,經(jīng)測試確實下降3MS左右幸好滿足預(yù)期。
GBA傳承
1、針對數(shù)據(jù)庫鎖測試時,一定要考慮并發(fā)測試場景,并確保查詢和使用數(shù)據(jù)源都在鎖內(nèi)進(jìn)行,避免數(shù)據(jù)不準(zhǔn)確;
2、性能壓測過程中除了觀察接口調(diào)用返回正確性,還需要觀察產(chǎn)生的數(shù)據(jù)是否完全和預(yù)期相符,數(shù)據(jù)量大時建議用腳本或者編寫小工具進(jìn)行校驗,在上億條日志中不要放過任何一條可疑日志。
個人感受:
1、事務(wù)處理和數(shù)據(jù)鎖相關(guān)測試,需要介入代碼review,并理清各種約束條件和觸發(fā)場景設(shè)計壓測用例;
2、需求評估階段單純的認(rèn)為接口壓測僅需要把各種接口串聯(lián)在一起進(jìn)行并發(fā)測試,只需要觀察接口返回正確性就OK,差點疏忽了復(fù)雜場景下接口返回是成功了但數(shù)據(jù)可能不一致的場景;
3、涉及金額的測試,出現(xiàn)概率就算再小也是大事,需要多留一份心。
posted on 2014-03-06 10:16 順其自然EVO 閱讀(283) 評論(0) 編輯 收藏 所屬分類: 數(shù)據(jù)庫