2016-05-31 55 views
1

我正在實施在線商店。選擇更新等待網絡操作?

我想知道是否可以使用select for update鎖定訂單記錄。
以下是我認爲鎖定的訂單狀態更改。

  • 支付處理:買受人支付的訂單,訂單從去到waiting-for-paymentpaid
  • 訂單取消:買方或賣方取消
  • 爲了確認順序:賣家確認訂單,使買方不能取消訂單

例如,當買方取消訂單,賣方確認訂單。
如果沒有鎖定,買方可能會執行取消操作,賣方可能會同時確認訂單。
但隨着鎖定,買方取消或賣家確認。

到目前爲止,我的問題是這樣的:即使它只是表中的一行,鎖定等待網絡操作(支付處理)的訂單實例會有太大的性能開銷?

我正在使用postgresql

回答

1

您正在使用數據庫鎖定機制來實現業務邏輯。這是一個壞主意。

取而代之的是引入[交易狀態]標誌字段並對其進行分析以應用業務邏輯。這可以在業務場景中實現靈活性,因爲您可以擁有適用於每個州的多個不同的交易狀態和複雜的業務規則。

更好的是仍然使用事務處理歷史記錄表,其中包含事務狀態隨時間變化的完整日誌。

更新: 只有與歷史記錄一致,狀態纔會更改。如果付款失敗,則無法標記已付訂單並將其回滾。

對於每一項更改,都應該有一個需要在操作發生之前驗證的需求清單。檢查有沒有物品客戶確認收貨地址總價格大於之前要求付款的

有順序狀態變化的無限場景,並且每個狀態都有一個單獨的代碼,也包括整個歷史是不切實際的。爲了確認付款或者未送達或從供應商任意數量的其他情形到達預訂購項目客戶退貨更換後才能成爲可供調度。

更好地跟蹤每個訂單的訂單狀態完整歷史記錄以分析業務情景並相應地選擇最佳的下一步行動。

+0

我不太明白你的答案。「最好還是使用事務處理歷史記錄表,記錄交易狀態隨時間變化的完整日誌」你能否給我提供一個鏈接,讓我可以更好地理解這句話? – eugene

+0

我的猜測是,你創造了狀態變化的歷史。並且在你改變狀態之後,你查看以前的狀態改變並且提出錯誤並且回滾,如果當前狀態改變從先前狀態無效的話。想知道我可以如何使用歷史表..? – eugene