使用MySQL防止电子商务应用程序的竞争条件

时间:2011-02-24 09:44:01

标签: mysql e-commerce

我正在使用MySQL构建电子商务应用程序,但我很难想出一个可以防止以下竞争条件的解决方案:

两位用户同时使用购物车中的相同商品结帐。商店只有一件商品可供出售。一个用户应该能够购买最后一个项目,而另一个用户应该看到一条错误消息,因为该项目缺货。

我正在使用物品计数器来跟踪库存中的物品数量,所以我想我会在处理用户的信用卡后减少物品。

我知道MySQL中的SELECT...UPDATE查询,但我想远离锁定行或表 - 除非这是电子商务应用程序解决此问题的最佳方式。

除了检查/减少项目计数器之外,我还有兴趣听取其他解决方案。

2 个答案:

答案 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.如果可用性正常,请再次检查可用性,然后一切正常......如果可用性已关闭,我会撤销订单并通知客户。