【发布时间】:2014-10-03 16:48:42
【问题描述】:
在采访中,我经常被问到有关电影票或旅游网站等网络应用程序中的比赛条件的问题。
问题是这样的。
比如巴士或机票网站,只剩下座位了。不同计算机上的两个(或在极端情况下为多个)用户同时登录网站,看到只剩下一个座位。他们都继续,选择那个座位并下订单。
现在我们必须处理两个请求。对于第一个请求,我们将预订机票,但对于第二个请求,我们必须抛出一个错误并向最终用户显示错误消息,说座位不可用。 假设数据库架构是这样的:
bus_id, seat_id,is_taken
所以对于第一个请求,我们为相应的bus_id,seat_id 1设置is_taken。然后对于第二个请求,将没有任何is_taken = 0的seat_id,因此我们不会预订机票。
但是在这里,在我看来,我们设置了一个限制,即一次只能处理一个请求;只有在第一个请求完成后,才能处理第二个请求。
但这不切实际,因为我们可能有一个巨大的网站,其中有大量的流量和应用程序在多个服务器上并行运行。我们必须并行处理请求。
由于我在处理这类多线程 Web 应用程序中的竞争条件方面没有太多经验,所以我不太清楚解决这个问题的正确方法是什么。
解决这些场景的正确(即使是基本)方法/设计模式是什么?
【问题讨论】:
标签: multithreading web-applications backend race-condition