天天看點

記一次資料庫髒讀

參考:https://www.cnblogs.com/fjdingsd/p/5273008.html

案例:一次處理收貨資料送出,有2個不同貨源,卻分别有一個相同的sku要記錄到收貨詳情後,并且更新庫存數量。由于操作過程環節比較複雜,就生成2個線程異步送出。

寫收貨新紀錄是沒有問題,但是兩個線程差不多同時讀取到原有sku的庫存數量,在經過其他操作後,先後更新了該sku的庫存數量,誰最後送出,更新後的庫存數量就是誰的。此操作完全是資料庫髒讀造成的,沒有對兩個線程進行事物管理。

解決方案:1.将2個異步線程線程範圍擴大至一次記錄送出,提前線程,讓這2次入庫記錄有明顯的先後順序。(造成問題是操作可能沒結束,使用者再次進行頁面送出,會造成二次重複資料送出)

2.防止重複送出,背景處理方式,利用redis有個setNx方法去緩存關鍵資訊,根據接口最大執行時間來緩存該key,做校驗,防止重複送出

3.頁面做防止重複送出

4.細化處理粒度,将查詢和更新放入一個事物裡面去處理