100000个用户同时在ASP.NET中购买相同的产品

时间:2014-07-21 14:20:57

标签: asp.net concurrency transactions

我遇到了麻烦。让我说,有一个产品表,结构是:

ProductID   ProductNumber  ProductName   Quantity

   1         A346457577       AAA            2

我的要求:

假设每个用户只能购买一个。

在我的系统中当100000个用户同时提交订单时,总数

远远超过2.如何避免这种情况?队列?内存缓存?我没有想法.Tks!

1 个答案:

答案 0 :(得分:1)

使用交易。每个交易都确保在交易结束时数据的一致性(数量> = 0)。

应该专门检查一致性,因此不允许两个交易同时修改数量。

亚马逊做什么 - 接受订单(没有承诺),不修改数量。下一步是 - 服务尝试处理订单(此处运行的事务),如果出现问题(独占一致性检查),请将拒绝订单消息发送给客户。

当在每个UI请求中无法提供订单处理时,最后一种方法更符合高可用性要求。

关于交易

数据库事务是实现的一种方式。例如在T-SQL中:

begin transaction

set @quantity = select Quantity from Products where ProductName = 'AAA'
if @quantity >= @orderedQuantity
begin
    update Products set Quantity = Quantity - @orderedQuantity 
    where ProductName = 'AAA'

    commit transaction
end
else begin
    rallback transaction
end

通常,您的事务需要确保它对要更新的记录获取独占写锁定,并在一致性检查后提交数据。如果未通过一致性检查,请回滚。