繁体   English   中英

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

[英]How to handle concurrent access in mysql?

如果购物网站上只有1种产品可用,而2个人尝试同时购买,那么谁会得到该产品? 服务器将如何确定用户的优先级。“对亚马逊上的快速销售感到好奇”。 哪种算法?

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

我假设您的情况是:

  • 有两个用户登录到您的系统,说他们分别是U1U2
  • 选择一个产品
  • 只提供一种产品
  • 他们都单击了添加到购物车/立即购买/结帐
  • 将为一个用户提供服务,并且将通知另一用户该产品不再可用

假设T1T2是单击结帐按钮时的时间的纳秒表示。 T1T2彼此相等的机会很小,但是有可能。

在您的情况下,Web服务器将在两个不同的线程TH1TH2满足用户生成的两个请求。 这是极不可能的,因为在任何给定时间系统中都会有数百个用户,但假设您有多个内核,则TH1TH2由CPU的两个不同内核提供服务并非不可能。

因此, TH1TH2都将尝试控制您的产品。

现在,您需要为PRODUCT提供/引入两个属性(如MySQL列): VERSIONCHECKED_OUT

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

TR1TR2都将:

  • 从数据库表中读取您的PRODUCT以及VERSIONCHECKED_OUT{id: 1, version: 0, checked_out: 0, ...}并将其传输到服务器。
  • 在服务器中, TR1TR2都将增加先前读取的VERSION值,并执行一条Update语句,该语句声明UPDATE PRODUCT SET CHECKED_OUT = 1, VERSION = 1 WHERE ID = 1 AND VERSION = 0
  • DB将锁定行,执行UPDATE并按顺序方式返回修改后的行号,因为UPDATE应该在单个线程内执行。 请注意,此线程是DB自己的线程,而不是TR1TR2
  • 在这里,如果我假设TR1 (即TH1TR2之前,即TH2由DB的UPDATE线程提供),则TR1后面的业务逻辑将获得更新的行数等于1,而TR2的行数将变为0。
  • 这反过来意味着U1可以检出产品,而U2会收到一条很好的道歉消息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM