商店情景赛车条件

时间:2013-01-05 11:24:22

标签: concurrency webshop

想象一下使用自己的货币的小网店。

在数据库中,有一个项目表,可以购买。每个项目的数量有限。此限制以整数形式存储在此表的列中。

此外,还有一个用户现金帐户表,而每个帐户都保存当前余额。

例如,如果两个用户同时进行购买且只有一个项目可用,则两个用户都可能付费,但由于竞赛条件,只有一个用户收到该项目。

如何解决这样的竞赛条件,而不依赖实体框架在保存方面抛出异常?

如何确保可用商品的数量以及买家的帐户余额是否正确更新?

1 个答案:

答案 0 :(得分:1)

这不是特定于Entity Framework的问题,它几乎适用于任何商店场景。它归结为政策问题 - 确保两个客户不购买相同商品的唯一方法是允许在将商品添加到购物车或开始结帐流程时对该商品进行临时锁定,类似于音乐会门票或航班的销售方式。如果购买未在规定的时间内完成,则此锁定将过期,并且该项目将被释放回供其他客户购买。

在电子商务环境中,这并不合适,因为人们可能会将商品添加到购物车而不会退房,或者花费额外的时间选择其他商品。这可能导致您有待售物品但无法购买的情况,因为他们在某人的购物车中并不打算退房。相反,允许重复订单,但付款通常只是预先授权,然后在发货或订单确认时完成,因此即使第二个客户输入他们的所有详细信息并按下“购买”,他们的卡也不会被收费,因为项目不会发货。

您可以在结帐过程中的不同阶段实施支票,以确保购物车中的商品仍然可用,或者在最简单的级别,将其留在最后一页上的最后“立即付款”按钮。但最终,这只会减少竞争条件的可能性,而不是消除它。