首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在mysql中处理并发访问?

如何在mysql中处理并发访问?
EN

Stack Overflow用户
提问于 2019-07-08 15:38:52
回答 1查看 479关注 0票数 0

如果一个购物网站只有一个产品可用,而同时有两个人试图购买它,谁会得到这个产品?服务器将如何优先考虑用户。“好奇亚马逊上的闪电销售,翻转卡丁车”。哪种算法?

EN

回答 1

Stack Overflow用户

发布于 2019-07-09 17:02:13

以下是幕后可能发生的事情,使用任何现代应用程序框架都很容易实现。

我假设你的场景是:

登录到您的系统的两个用户说他们是购物车和U2

  • Select a U1

  • 只有一个产品可用,他们都单击了Add to

  • user

,系统将为另一个用户提供服务,并将通知另一个用户该产品不再可用

假设T1T2是他们单击结帐按钮时的纳秒表示。T1T2相等的可能性很低,但也有可能。

在您的例子中,web服务器将在两个不同的线程TH1TH2中为用户生成的请求提供服务。这是非常不可能的,因为您的系统中随时都有成百上千的用户,但是假设您有多个核心,那么TH1TH2由两个不同的核心提供服务并不是不可能的。

因此,TH1TH2都会试图抓住你的产品。

现在,您需要向PRODUCT添加/引入两个属性(视为MySQL列):VERSIONCHECKED_OUT

假设您使用InnoDB作为数据库引擎,TH1TH2将同时启动自己的事务,比如TR1TR2

TR1TR2都将:

  • 从数据库表中读取您的PRODUCT以及VERSIONCHECKED_OUT{id: 1, version: 0, checked_out: 0, ...},并将其传输到服务器。在服务器中,
  • 将增加先前读取的< TR1 >d43值,并执行一条更新语句,声明UPDATE PRODUCT SET CHECKED_OUT = 1, VERSION = 1 WHERE ID = 1 AND VERSION = 0
  • DB将锁定该行,执行UPDATE,并按顺序返回修改后的行号,因为UPDATE应在单个线程中执行。注意,这里这个线程是DB自己的线程,而不是TR1TR2.
  • Here如果我假设TR1,即TH1TR2之前提供服务,即DB的UPDATE线程提供TH2,那么TR1后面的业务逻辑将获得更新的行数等于1。而TR2将得到0。
  • ,这反过来意味着U1可以检查产品,而U2将收到一条友好的道歉消息。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56930336

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档