【问题标题】:100000 users concurrent to buy the same product in ASP.NET100000 用户同时在 ASP.NET 中购买相同的产品
【发布时间】:2014-07-21 14:20:57
【问题描述】:

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

ProductID   ProductNumber  ProductName   Quantity

   1         A346457577       AAA            2

我的要求:

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

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

远不止2。如何避免这种情况?队列?内存缓存?我没有想法。谢谢!

【问题讨论】:

  • 这是一个巨大的在线商店,有 100,000 名用户同时购买相同的商品……阅读数据库交易。
  • 你遇到了什么麻烦?出了什么问题?您如何验证销售,您在减去之前检查数量吗?
  • 是的,它是一个巨大的在线商店

标签: asp.net concurrency transactions


【解决方案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

一般来说,您的事务需要确保它获得对要更新的记录的独占写入锁,并在一致性检查后提交数据。如果一致性检查没有通过,则回滚。

【讨论】:

  • 感谢您的回答。什么交易?数据库事务?你能给我一个例子吗?再次感谢
  • 是的,数据库事务可以工作。我在我的答案中添加了一个关于如何在 T-SQL 中执行此操作的示例。
猜你喜欢
  • 2014-03-13
  • 1970-01-01
  • 2019-09-14
  • 1970-01-01
  • 1970-01-01
  • 2016-09-19
  • 2021-03-17
  • 2012-06-09
  • 1970-01-01
相关资源
最近更新 更多