【问题标题】:Preventing race conditions for ecommerce application with MySQL使用 MySQL 防止电子商务应用程序的竞争条件
【发布时间】:2011-02-24 09:44:00
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 回复:“除 ... 物品计数器之外的解决方案”请参阅 kylebanker.com/blog/2010/04/30/mongodb-and-ecommerce 上的库存部分。我知道它正在使用 mongo,但这个想法也可以在 mysql 中使用。例如。有一个inventory 表,其中每个选项都有一个条目。这与 user/session_id 相关联并具有状态:available、in_cart 和 sold。缺点;你的inventory 表最终会变得非常大。

标签: mysql e-commerce


【解决方案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”发生。在库存开始用完时及时补充库存。

【讨论】:

  • 感谢提示!我很好奇锁定何时以及如何影响性能。你有任何例子吗?
  • 如果你有争用(很多线程在等待同一个锁),那么它会损害性能。通常在 mysql 中,如果您使用支持行级锁定的引擎(如 innodb),则不会有什么大问题,除非您有很多线程等待在同一实例中写入单行。
【解决方案2】:

我要解决的方法是 1. 检查 X 本书的可用性 2.如果有X本书,请下单 3. 再次检查可用性,如果可用性正常,则一切正常...如果可用性关闭,我将取消订单并通知客户。

【讨论】:

    猜你喜欢
    • 2016-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-27
    • 2011-03-24
    • 1970-01-01
    • 2017-07-24
    • 1970-01-01
    相关资源
    最近更新 更多