我有以下问题:
我们系统的产品在发布时只允许购买 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。这种情况大约每年发生一次:(。
解决这个问题的最佳解决方案是什么?我正在使用 ASP.NET/C#、Ling2SQL 和 MSSQL。我们每天有 1000> 个订单。按照请求的顺序处理订单很重要。
到目前为止我想出的解决方案:
一个全局互斥锁?
每个产品一个互斥体存储在哈希表中,访问函数如下:
private Mutex GetPurchaseMutex(Guid productId) { if (mutexTbl[productId] == null) { mutexTbl[productId] = new Mutex(); } return (Mutex)mutexTbl[productId]; }
其中 mutexTbl 是一个哈希表。在这里,我还没有弄清楚如何以一种好的方式丢弃旧的互斥锁。
在 Order 表上使用 T-SQL INSERT 触发器来检查有多少订单:
CREATE TRIGGER Triggers_OrderInsertTrigger ON Orders AFTER INSERT AS IF /* 检查是否有很多订单 */ BEGIN RAISERROR ('Too many orders', 16, 1); 回滚交易;返回结束;
但我不太喜欢这两种解决方案。你会如何解决这个问题?