mysql - mysql如何处理并发访问?

标签 mysql web-services concurrency database-concurrency

如果一个购物网站只有 1 种产品可供选择,并且有 2 个人同时尝试购买该产品,那么谁会获得该产品?服务器将如何优先考虑用户。“对亚马逊、翻转卡丁车上的闪购感到好奇”。哪种算法?

最佳答案

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

我假设您的情况是:

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

假设 T1T2 是他们单击结帐按钮时的纳秒表示形式。 T1T2 彼此相等的机会非常低,但有可能。

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

因此,TH1TH2 都会尝试保留您的产品。

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

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

TR1TR2 都将:

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

关于mysql - mysql如何处理并发访问?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56930336/

相关文章:

java - 硬编码 SQL 语句 VS。用于执行查询的 Web 服务

multithreading - 任何线程如何发出释放二进制信号量的信号

php - 'this' 中的未知列 'where clause'

mysql - 如何在mysql中编写一个搜索查询来匹配不同表中的列并返回第一个表中的另一列?

mysql - 距经度 x 距离的最大纬度 - 距纬度 x 距离的最大经度 - SQL

c# - WebHttpBinding 与 Http 和 Https

PHP:将 ID 发送到 HTML 按钮以查看数据库行

java - 在 JAVA 中使用 WSDL 使用 Web 服务

java - java中可以同时使用fork/join和executor服务吗?

java - 是否可以对实例初始化和分配给共享变量进行重新排序?