私は次の問題を抱えています:
私たちのシステムには、リリースされたときにX回だけ購入できる製品があります。購入時に、中央購入アルゴリズムが存在する注文の数をチェックし、X未満の場合は購入を続行します。
疑似的なC#コードの場合:
public class OrderMethods
{
public static Purchase(Product product, Client client)
{
int purchases = /* count order records of this product */;
if(purchases>=MAX_ORDERS) throw PurchaseException();
/* perform purchase by inserting order record in database */
}
}
問題は、特定の製品に対する需要が高い場合、同時に多くの要求が発生し、MAX_ORDERSを超えるものが登録されることがあるということです。これは約1年に1回発生します:(。
これを解決するための最良の解決策は何ですか?ASP.NET/C#、Ling2SQL、MSSQLを使用しています。1日あたり1000件以上の注文があります。注文は、要求された順序で処理されることが重要です。
私がこれまでに思いついた解決策:
1つのグローバルミューテックス?
次のようなアクセス関数を使用して、ハッシュテーブルに格納された製品ごとに1つのミューテックス。
private Mutex GetPurchaseMutex(Guid productId) { if (mutexTbl[productId] == null) { mutexTbl[productId] = new Mutex(); } return (Mutex)mutexTbl[productId]; }
ここで、mutexTblはハッシュテーブルです。ただし、ここでは、古いミューテックスを適切な方法で破棄する方法がわかりません。
OrderテーブルでT-SQLINSERTトリガーを使用して、注文の数を確認します。
CREATE TRIGGER Triggers_OrderInsertTrigger ON Orders AFTER INSERT AS IF/*注文数が多いかどうかを確認します*/BEGIN RAISERROR('Too manyorders'、16、1); ロールバックトランザクション; リターンエンド;
しかし、私はこれらの解決策のどちらもあまり好きではありません。これをどのように解決しますか?