如果一个购物网站只有一个产品可用,而同时有两个人试图购买它,谁会得到这个产品?服务器将如何优先考虑用户。“好奇亚马逊上的闪电销售,翻转卡丁车”。哪种算法?
发布于 2019-07-09 17:02:13
以下是幕后可能发生的事情,使用任何现代应用程序框架都很容易实现。
我假设你的场景是:
登录到您的系统的两个用户说他们是购物车和U2
U1
,系统将为另一个用户提供服务,并将通知另一个用户该产品不再可用
假设T1和T2是他们单击结帐按钮时的纳秒表示。T1和T2相等的可能性很低,但也有可能。
在您的例子中,web服务器将在两个不同的线程TH1和TH2中为用户生成的请求提供服务。这是非常不可能的,因为您的系统中随时都有成百上千的用户,但是假设您有多个核心,那么TH1和TH2由两个不同的核心提供服务并不是不可能的。
因此,TH1和TH2都会试图抓住你的产品。
现在,您需要向PRODUCT添加/引入两个属性(视为MySQL列):VERSION和CHECKED_OUT。
假设您使用InnoDB作为数据库引擎,TH1和TH2将同时启动自己的事务,比如TR1和TR2。
TR1和TR2都将:
PRODUCT以及VERSION和CHECKED_OUT:{id: 1, version: 0, checked_out: 0, ...},并将其传输到服务器。在服务器中,TR1 >d43值,并执行一条更新语句,声明UPDATE PRODUCT SET CHECKED_OUT = 1, VERSION = 1 WHERE ID = 1 AND VERSION = 0UPDATE,并按顺序返回修改后的行号,因为UPDATE应在单个线程中执行。注意,这里这个线程是DB自己的线程,而不是TR1和TR2.TR1,即TH1在TR2之前提供服务,即DB的UPDATE线程提供TH2,那么TR1后面的业务逻辑将获得更新的行数等于1。而TR2将得到0。U1可以检查产品,而U2将收到一条友好的道歉消息。https://stackoverflow.com/questions/56930336
复制相似问题