將編輯好的 SQL 查詢複製到 SSMS 會出現無法執行錯誤

電子商務搶購模擬 - 將購訂單商品數量與庫存量作關聯

在電子商務業務流程中,一筆訂單在成立到出貨中間商品還是儲存在倉庫中。商品會在出貨的時候才會從倉庫中減少現有數量,此指令碼會將訂單購買的商品數量與商品庫存作關聯

商品「可購買庫存量」為:「商品庫存資料表數量」減「未出貨訂單中購買的商品總數量」

訂單流程並未實作在範例程式碼

建立訂單時若訂單中有一筆商品「可購買庫存量」少於訂單購買的數量時,就不進行該筆訂單的建立作業

當消費者在商品出貨前取消訂單時,系統不需要進行商品庫存的回補作業,該商品在訂單中購買庫存會自動減少

接下來開始建立以上述邏輯為基礎的資料庫物件

修改資料庫物件

執行 procedure-default.sql 修改 Products.GetProductValidStorage 與 Orders.AddOrder 資料庫物件

執行搶購模擬

使用下面指令進行搶購模擬

dotnet eShop.Loader.dll -t 2500 -e 11:37

啟用後會等待直到設定時間

執行時會持續做商品購買作業

執行完成後點選任意按鍵結束應用程式

模擬結束後開啟資料表查詢確認商品購買的狀態

確認結果

檢查 Events.AddEventDatabaseError 是否有預存程序執行錯誤

沒有錯誤產生

執行 validation.sql 指令碼確認查詢結果是否有超賣

查詢結果顯示訂購的商品總量超過庫存資料表的商品量

額外檢視

確認 Orders.OrderMains 訂單資料表是否有異常情況

主索引與訂單編號的順序並不相同,從建立日期看到建立時間是相同的

從 Events.EventBuying 資料表紀錄中顯示有 87 次的下單失敗

因為下單的商品跟數量是隨機產生,此數量沒有甚麼實際意義
結論

此資料庫設計在搶購情況下會有商品超賣的情況產生,並不是一個好的設計方式

接下來介紹另外一種資料庫設計方式
扣除購買商品的商品庫存量

章節清單
  1. 電子商務網站商品搶購模擬 - 使用預存程序
  2. 建立 eShop 資料庫
  3. 模擬搶購應用程式簡介
  4. 將購訂單商品數量與庫存量作關聯
  5. 扣除購買商品的商品庫存量
延伸閱讀

在 Orders.AddOrder 預存程序中有保留設定交易隔離層級的 Transact-SQL 指令碼 可以自由設定確認是否依樣會有超賣的情況

留言