同时发送相同的查询
查询并不总是平行运行
这取决于数据库引擎.使用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是一个不错的选择)标记您要修改的记录 - 如果您来修改它,还有其他内容已更改它,然后您的代码知道它先前检索的数据无效.然而,这可能导致其他并发症.
| 归档时间: |
|
| 查看次数: |
9178 次 |
| 最近记录: |