管理商店结帐流程的并发性
Managing concurrency on store checkout process
我整天都在阅读以寻找在电子商务结账流程中管理并发的正确方法,但我仍然不确定如何开发它。
场景
用户从商店中选择 一件 产品,转到结帐页面并使用他的信用卡付款。该站点处理付款检查 库存可用性 并使用网络服务以及用户信用卡数据和。 Web 服务最终 return 结果和站点显示成功页面(或失败)。
最终结帐和付款验证流程
- 用户开始最后的结帐步骤
- 我检查产品是否有库存
- 如果产品有库存,我调用支付网络服务
- 如果webservice结果是"OK",我显示成功页面
听起来很简单,但我的问题是我获取产品库存的方式:我每次都必须计算它。我有两个 tables product 和 sales (仅示例 tables),所以每次销售完成, 添加了一个 销售行 链接它所属的产品。在 product table 上,我有一个产品可以销售的最大次数,比如初始库存。
因此,例如,我的产品 X 的初始库存为 99,并且两个用户开始了最后一个可用单位的结帐流程。我检查当前售出的单位 = 98。好的,两个用户都可以购买,我调用网络服务,最后两个用户都购买并支付了产品。
知道在这种情况下如何处理并发吗?
顺便说一句:我正在使用 MySQL 和 InnodB
我终于实施了乐观离线锁 (http://martinfowler.com/eaaCatalog/optimisticOfflineLock.html) 模式,因此一次只有一个用户可以购买一件商品。如果用户放弃交易,我必须非常小心地管理超时的死用户连接。
我整天都在阅读以寻找在电子商务结账流程中管理并发的正确方法,但我仍然不确定如何开发它。
场景
用户从商店中选择 一件 产品,转到结帐页面并使用他的信用卡付款。该站点处理付款检查 库存可用性 并使用网络服务以及用户信用卡数据和。 Web 服务最终 return 结果和站点显示成功页面(或失败)。
最终结帐和付款验证流程
- 用户开始最后的结帐步骤
- 我检查产品是否有库存
- 如果产品有库存,我调用支付网络服务
- 如果webservice结果是"OK",我显示成功页面
听起来很简单,但我的问题是我获取产品库存的方式:我每次都必须计算它。我有两个 tables product 和 sales (仅示例 tables),所以每次销售完成, 添加了一个 销售行 链接它所属的产品。在 product table 上,我有一个产品可以销售的最大次数,比如初始库存。
因此,例如,我的产品 X 的初始库存为 99,并且两个用户开始了最后一个可用单位的结帐流程。我检查当前售出的单位 = 98。好的,两个用户都可以购买,我调用网络服务,最后两个用户都购买并支付了产品。
知道在这种情况下如何处理并发吗?
顺便说一句:我正在使用 MySQL 和 InnodB
我终于实施了乐观离线锁 (http://martinfowler.com/eaaCatalog/optimisticOfflineLock.html) 模式,因此一次只有一个用户可以购买一件商品。如果用户放弃交易,我必须非常小心地管理超时的死用户连接。