qileilove

          blog已經轉移至github,大家請訪問 http://qaseven.github.io/

          1688額度中心并發交易場景下鎖機制問題

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

          posted on 2014-03-06 10:16 順其自然EVO 閱讀(278) 評論(0)  編輯  收藏 所屬分類: 數據庫

          <2014年3月>
          2324252627281
          2345678
          9101112131415
          16171819202122
          23242526272829
          303112345

          導航

          統計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 尤溪县| 泽州县| 金湖县| 河池市| 钟山县| 乌鲁木齐市| 波密县| 石林| 黄骅市| 依安县| 乐安县| 蓝山县| 望城县| 大新县| 许昌市| 池州市| 怀安县| 葵青区| 防城港市| 巨野县| 关岭| 云浮市| 巴林左旗| 兴文县| 丰镇市| 兴义市| 安图县| 织金县| 定州市| 梅州市| 镇巴县| 巴彦淖尔市| 石屏县| 金昌市| 辛集市| 博客| 秦皇岛市| 天长市| 垦利县| 齐齐哈尔市| 铜鼓县|