MySQL队列查询吗?

Mad*_*nyo 5 php mysql sql database

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

我有一个商店,剩下一件商品.两个或更多人购买该项目,并且查询在MySQL服务器上完全同时到达.我的猜测是它会排队,但如果是这样,MySQL如何选择第一个执行,我可以对此有影响吗?

sym*_*ean 6

同时发送相同的查询

查询并不总是平行运行

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

echo_me说 nothing happens at the exact same time and a CPU does not do everything at once

这不完全正确.DBMS可能可以在具有多个cpu且具有多个网络接口的计算机上运行.2个查询可能同时到达是非常不可能的 - 但并非不可能,因此有一个互斥锁可确保配对/执行转换仅作为单个线程(执行 - 不一定是相同的轻量级进程)运行.

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

你的问题是你有两个mysql客户端,每个客户端都检索到剩下一个库存的事实.由于(自提到PHP以来)库存水平可能已在不同的DBMS会话中检索而不是后续库存调整这一事实使您更加复杂 - 您不能拥有超过HTTP请求的事务.因此,您需要在单个事务中重新验证在DBMS外部维护的任何事实.

乐观锁定可以创建一个伪事务控制机制 - 您使用时间戳和用户标识符(使用PHP PHP会话ID是一个不错的选择)标记您要修改的记录 - 如果您来修改它,还有其他内容已更改它,然后您的代码知道它先前检索的数据无效.然而,这可能导致其他并发症.