2013-08-18 64 views
1

有許多與我的問題相關的類似問題。但我沒有找到任何令人滿意的回答我的問題。所以我在這個論壇上提出這個問題。庫存控制的併發控制

我在庫存管理系統中的併發控制有一個問題。 假設我的產品A,B,C的數量是2,3,4。而我的應用程序是多用戶。

我有產品頁面,其中用戶看到的產品和可用數量列表。 ,我已經檢查和付款頁面,可能需要一段時間才能達到產品頁面。

現在,如果是多用戶Web應用程序,並且說用戶1訂購了2個數量的產品A但訂單尚未放置,則用戶2仍然可以看到具有2個數量的A。

我應該暫時(可配置的時間)鎖定產品A的兩個數量,直到下訂單嗎?這是一個很好的設計嗎?如果是的話,我應該鎖定在Java還是在數據庫中?

+0

可以鎖定它基於你的網站流量小的時間,如果用戶不買時間內該項目,那麼你可以刪除該鎖。 – Sam

回答

1

我應該暫時(可配置的時間)鎖定產品A的兩個數量,直到下單嗎?這是一個很好的設計嗎?

這取決於您網站的會話率,即結帳數量/付款次數。如果您的對話率很高,則可以預先鎖定數量以獲得更好的用戶體驗。

如果是,我應該鎖定在java還是數據庫中?

您需要一個全局鎖定以保證正確性。如果您有多個應用程序服務器,則必須將該鎖放入數據庫中。

3

不,這不是一個好設計,因爲它適用於濫用和問題。如果用戶(競爭對手?)在整個月內鎖定了所有產品,該怎麼辦?如果另一個人用產品填充他/她的購物車,然後決定它是太多錢,並關掉他/她的設備?

最佳替代方案是:

1)給了用戶極大的可用性是如何每一個產品,而且還告訴他/她,如果訂單不盡快把它能夠消失。這也應該激勵銷售。請在付款頁面後鎖定/解鎖您的產品,即當有業務提交給操作時。如果可用數量不夠,請將用戶返回上一頁,更新可用數量。

2)與1)類似,但您也可以隨時更新可用性。或發送警告,例如「購物車中某些物品的庫存量不足」。同樣,這也可能促進銷售。

3)預留(「鎖定」)項目,因爲它們被移動到購物車,但不是永遠。鎖定一段時間後釋放項目。隨時通知用戶。超時可以是整個購物車或每個項目。

需要注意的是,上面提到的任何「鎖」都是「商務鎖定/預訂」,這一點非常重要。它不需要以鎖或任何其他特定技術解決方案的形式實施。例如,上述3)可以通過添加字段locked_bylocked_until來實現。當您檢查/更新/操作這些字段時,您可能需要在「技術鎖定」內執行此操作。檢查/更新完成後,技術鎖將被釋放。但是,由於locked_until還沒有過期,所以「商業鎖定」仍可以實施,任何其他代碼都會檢查此字段是否可用。爲什麼?因爲業務規則強制要求(不是因爲有技術鎖定,實際上不是這樣)。

「技術鎖定」應該是非常快的。 「商業鎖定」可能會更長(但永遠不會;永遠爲他們定義時間限制)。

很難告訴你是否應該「在Java中」鎖定「數據庫」與您提供的信息非常少。例如,您是否在使用Entity Beans?你的容錯要求是什麼?等

也就是說,在一般情況下,它可能更好地保持鎖(只要它們是「商業鎖」)在數據庫中,這些主要的原因:

  • 持久性(在的情況下,電源故障)。您還應該提供恢復購物車的機制。也許還將它們存儲在數據庫中?
  • 能力與其他環境(即,企業ERP或fullfillment系統)接口。