我正在使用MySQL构建电子商务应用程序,但我很难想出一个可以防止以下竞争条件的解决方案:
两位用户同时使用购物车中的相同商品结帐。商店只有一件商品可供出售。一个用户应该能够购买最后一个项目,而另一个用户应该看到一条错误消息,因为该项目缺货。
我正在使用物品计数器来跟踪库存中的物品数量,所以我想我会在处理用户的信用卡后减少物品。
我知道MySQL中的SELECT...UPDATE
查询,但我想远离锁定行或表 - 除非这是电子商务应用程序解决此问题的最佳方式。
除了检查/减少项目计数器之外,我还有兴趣听取其他解决方案。
答案 0 :(得分:1)
为什么担心锁定。它不会伤到你,直到你同时拥有100个同时的客户,并且像innodb这样的数据库引擎可以处理这些事情。你无法从某种原子性和解决方法中获得成功。
您需要保持应用程序级别的事务管理。
checkout
reserver_the_items_in_cart
if(reservation_succesfull){
get_the_payments_done_via_payment_gatway
if(payment_successful) {
update_the_reserverd_to to sold_status
}else{
make_reserved_item_to_available.
}
}else{
show_error_that_item_not_available.
}
处理此问题的其他最佳方法是永远不要让“show_error_that_item_not_available”发生。在库存开始耗尽时及时补充库存。
答案 1 :(得分:0)
我这样做的方式是 1.检查X书的可用性 2.如果有X书,请下订单 3.如果可用性正常,请再次检查可用性,然后一切正常......如果可用性已关闭,我会撤销订单并通知客户。