Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MySQL是否执行队列查询?_Php_Mysql_Sql_Database - Fatal编程技术网

Php MySQL是否执行队列查询?

Php MySQL是否执行队列查询?,php,mysql,sql,database,Php,Mysql,Sql,Database,如果有两个人同时向数据库发送相同的查询,而其中一个人使另一个查询返回不同的结果,会发生什么情况 我有一家商店,只剩下一件东西了。两个或两个以上的人购买该商品,并且查询在MySQL服务器上同时到达。我的猜测是,它只会排队,但如果是这样,MySQL如何选择第一个执行,我能对此产生影响?它们会在用户请求时立即执行,因此如果有10个用户在同一时间请求查询,那么将有10个查询在同一时间执行 任何事情都不会在同一时间发生,CPU也不会同时处理所有事情。它一次只做一件事(每个核心和/或线程)。如果10个用户正

如果有两个人同时向数据库发送相同的查询,而其中一个人使另一个查询返回不同的结果,会发生什么情况


我有一家商店,只剩下一件东西了。两个或两个以上的人购买该商品,并且查询在MySQL服务器上同时到达。我的猜测是,它只会排队,但如果是这样,MySQL如何选择第一个执行,我能对此产生影响?

它们会在用户请求时立即执行,因此如果有10个用户在同一时间请求查询,那么将有10个查询在同一时间执行

任何事情都不会在同一时间发生,CPU也不会同时处理所有事情。它一次只做一件事(每个核心和/或线程)。如果10个用户正在访问运行查询的页面,他们将按特定顺序“点击”服务器并按该顺序进行处理(尽管该顺序可能以毫秒为单位)。但是,如果一个页面上有多个查询,您无法确保在启动另一个用户页面上的查询之前,一个用户页面上的所有查询都将完成。这可能会导致并发问题

编辑:

运行以查找要终止的连接的id

SHOW PROCESSLIST
将为您提供当前运行的所有查询的列表

MySQL将在快速CPU上运行良好,因为每个查询都在一个线程中运行,不能跨CPU并行


考虑类似于以下内容的查询:

UPDATE items SET quantity = quantity - 1 WHERE id = 100
不管MySQL服务器并行运行多少查询,如果运行两个这样的查询,并且
id
100的行具有
quantity
1,那么默认情况下会发生类似的情况:

  • 第一个查询锁定
    items
    中的行,其中
    id
    为100
  • 第二个查询尝试执行相同的操作,但该行被锁定,因此等待
  • 第一个查询将
    数量
    从1更改为0,并解锁该行
  • 第二个查询再次尝试,现在看到行已解锁
  • 第二个查询锁定
    items
    中的行,其中
    id
    为100
  • 第二个查询将
    数量
    从0更改为-1,并解锁该行

  • MySQL中的查询是并行处理的。您可以。

    这本质上是一个并发问题。通过使用事务,可以确保MySQL中的并发性。这意味着在您的eshop中,您可以确保您描述的比赛条件不会成为问题。请参阅下面关于MySQL中事务的链接

    根据您的隔离级别,两个并发查询将返回不同的结果

    同时发送相同的查询

    查询并不总是并行运行

    这取决于数据库引擎。使用MyISAM,几乎每个查询都会获得表级锁,这意味着查询是作为队列顺序运行的。对于大多数其他发动机,它们可以并联运行

    echo_me说
    没有什么事情是在同一时间发生的,CPU也不是一次完成所有事情的

    那不完全是真的。DBMS可能运行在具有多个cpu和多个网络接口的机器上。非常两个查询不可能同时到达-但并非不可能,因此有一个互斥来确保配对/执行转换仅作为单个线程运行(执行-不一定是相同的轻量级进程)


    有两种解决concurent DML的方法-使用事务(每个用户有效地获得数据库的克隆),当查询完成时,DBMS尝试协调任何更改-如果协调失败,DBMS将回滚其中一个查询并报告为失败。另一种方法是使用行级锁定-DBMS识别将通过查询更新的行,并将其标记为保留更新(其他用户可以读取每行的原始版本,但任何更新数据的尝试都将被阻止,直到该行再次可用)

    您的问题是您有两个mysql客户机,每个客户机都检索到了一个事实,即还剩下一项库存。由于(因为您提到了PHP)库存水平可能是在与后续库存调整不同的DBMS会话中检索到的,这一事实使情况更加复杂-您不能拥有跨越HTTP请求的事务。因此,您需要在单个事务中重新验证DBMS外部维护的任何事实


    乐观锁定可以创建一种伪事务控制机制——使用时间戳和用户标识符(使用PHP会话ID)标记要修改的记录(PHP会话ID是一个不错的选择)——如果在修改记录时,其他内容改变了它,那么代码知道以前检索到的数据无效。但是,这可能会导致其他并发症。

    “我能对此施加影响吗?”:-是的。使用适当的事务隔离级别,例如serializableWell,如果有10个用户,并且服务器有10个CPU,并且所有10个用户都会导致MySQL以完全相同的毫秒(极不可能)运行查询,理论上,如果MySQL使用所有CPU,并且没有同步对同一行的访问,那么所有10个查询都可以同时运行。我不确定你是否完全正确。它不需要在同一时间发生,就可以成为数据库中的一个问题。还有多个核心或CPU(大多数服务器都有这些)。而且,它们不会在被请求时立即执行。特别是如果存在隔离级别的话。重要的不是Web服务器上有多少内核或CPU,而是MySQL服务器上发生了什么。这个答案让我感到困惑,首先你告诉我们10个查询可以在同一时间执行,然后你说在同一时间什么都不会发生