如果一个购物网站只有 1 种产品可供选择,并且有 2 个人同时尝试购买该产品,那么谁会获得该产品?服务器将如何优先考虑用户。“对亚马逊、翻转卡丁车上的闪购感到好奇”。哪种算法?
最佳答案
以下是幕后可能发生的事情,使用任何现代应用程序框架都很容易实现。
我假设您的情况是:
- 登录您系统的两名用户称他们是
U1
和U2
- 选择产品
- 只有一种产品可供选择
- 他们都点击了“添加到购物车”/“立即购买”/“结帐”
- 将为一名用户提供服务,并通知另一名用户该产品不再可用
假设 T1
和 T2
是他们单击结帐按钮时的纳秒表示形式。 T1
和 T2
彼此相等的机会非常低,但有可能。
在您的情况下,网络服务器将在两个不同的线程 TH1
和 TH2
中处理用户生成的请求。这是极不可能的,因为您的系统中在任何给定时间都存在数百个用户,但 TH1
和 TH2
由两个不同的 CPU 核心提供服务并非不可能,假设您有多个核心。
因此,TH1
和 TH2
都会尝试保留您的产品。
现在,您需要为您的 PRODUCT
添加/引入两个属性(视为 MySQL 列):VERSION
和 CHECKED_OUT
。
TH1
和 TH2
将同时启动自己的事务,例如 TR1
和 TR2
,假设您有 InnoDB 作为数据库引擎。
TR1
和 TR2
都将:
- 从数据库表中读取您的
PRODUCT
以及VERSION
和CHECKED_OUT
:{id: 1, version: 0, check_out: 0, ...}
并将其传输到服务器。 - 在服务器中,
TR1
和TR2
都会增加之前读取的VERSION
值,并执行一条 Update 语句,说明更新产品集 CHECKED_OUT = 1,版本 = 1,其中 ID = 1 且版本 = 0
- DB 将锁定该行,执行
UPDATE
并按顺序返回已修改行的编号,因为UPDATE
应在单个线程中执行。这里注意,这个线程是DB自己的线程,而不是TR1
和TR2
。 - 这里,如果我假设
TR1
(即TH1
)是在TR2
(即TH2
)之前由数据库提供的UPDATE
线程则TR1
后面的业务逻辑将得到更新的行数等于 1,而TR2
将得到 0 . - 这反过来意味着
U1
可以查看产品,而U2
将收到一条友好的道歉消息。
关于mysql - mysql如何处理并发访问?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56930336/