我遇到了麻烦。让我说,有一个产品表,结构是:
ProductID ProductNumber ProductName Quantity
1 A346457577 AAA 2
我的要求:
假设每个用户只能购买一个。
在我的系统中当100000个用户同时提交订单时,总数
远远超过2.如何避免这种情况?队列?内存缓存?我没有想法.Tks!
答案 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
通常,您的事务需要确保它对要更新的记录获取独占写锁定,并在一致性检查后提交数据。如果未通过一致性检查,请回滚。