管理商店结帐流程的并发性

Managing concurrency on store checkout process

我整天都在阅读以寻找在电子商务结账流程中管理并发的正确方法,但我仍然不确定如何开发它。

场景

用户从商店中选择 一件 产品,转到结帐页面并使用他的信用卡付款。该站点处理付款检查 库存可用性 并使用网络服务以及用户信用卡数据和。 Web 服务最终 return 结果和站点显示成功页面(或失败)。

最终结帐和付款验证流程

听起来很简单,但我的问题是我获取产品库存的方式:我每次都必须计算它。我有两个 tables productsales (仅示例 tables),所以每次销售完成, 添加了一个 销售行 链接它所属的产品。在 product table 上,我有一个产品可以销售的最大次数,比如初始库存。

因此,例如,我的产品 X 的初始库存为 99,并且两个用户开始了最后一个可用单位的结帐流程。我检查当前售出的单位 = 98。好的,两个用户都可以购买,我调用网络服务,最后两个用户都购买并支付了产品。

知道在这种情况下如何处理并发吗?

顺便说一句:我正在使用 MySQL 和 InnodB

我终于实施了乐观离线锁 (http://martinfowler.com/eaaCatalog/optimisticOfflineLock.html) 模式,因此一次只有一个用户可以购买一件商品。如果用户放弃交易,我必须非常小心地管理超时的死用户连接。