1. 程式人生 > >對保存訂單的理解

對保存訂單的理解

int 是否 更新 sql數據庫 inf 隔離 對數 增加 基本

1. 後端接口設計

請求方式 : POST /orders/

請求參數: JSON 或 表單

參數類型是否必須說明
address int 收貨地址id
pay_method int 支付方式

返回數據: JSON

參數類型是否必須說明
order_id char 訂單編號

def create(self, validated_data):
    # 獲取當前下單用戶

    # 生成訂單編號

    # 保存訂單基本信息數據 OrderInfo

    # 從redis中獲取購物車結算商品數據

    # 遍歷結算商品:

        #
判斷商品庫存是否充足 # 減少商品庫存,增加商品銷量 # 保存訂單商品數據 # 在redis購物車中刪除已計算商品數據

在多個用戶同時發起對同一個商品的下單請求時,先查詢商品庫存,再修改商品庫存,會出現資源競爭問題,導致庫存的最終結果出現異常。

技術分享圖片

使用樂觀鎖,在更新的時候判斷此時庫存是否是之前查詢的庫存,如果相同,表示沒人修改過,可以更新,否則表示有人搶占過資源,不在執行庫存更新。返回重新創建訂單,直至庫存不夠。

需要修改mysql的事物隔離級別

事務隔離級別指的是在處理同一個數據的多個事務中,一個事務修改數據後,其他事務何時能看到修改後的結果。

MySQL數據庫事務隔離級別主要有四種:

  • Serializable 串行化,一個事務一個事務的執行
  • Repeatable read 可重復讀,無論其他事務是否修改並提交了數據,在這個事務中看到的數據值始終不受其他事務影響
  • Read committed 讀取已提交,其他事務提交了對數據的修改後,本事務就能讀取到修改後的數據值
  • Read uncommitted 讀取為提交,其他事務只要修改了數據,即使未提交,本事務也能看到修改後的數據值。

MySQL數據庫默認使用可重復讀( Repeatable read),而使用樂觀鎖的時候,如果一個事務修改了庫存並提交了事務,那其他的事務應該可以讀取到修改後的數據值,所以不能使用可重復讀的隔離級別,應該修改為讀取已提交Read committed。

技術分享圖片

技術分享圖片

對保存訂單的理解