【问题标题】:Queuing SQL requests PHP排队 SQL 请求 PHP
【发布时间】:2011-04-11 14:04:24
【问题描述】:

是否可以对访问 MySQL 中的数据库的客户端请求进行排队。我正在尝试这样做以进行并发管理。可以使用 MySQL 锁,但不知何故我无法获得预期的结果。

实际上我想要做的是:

  • 在新行中插入一些内容
  • 从该行中选择一列
  • 将该值存储在变量中

当两个不同的客户端同时 INSERT 时会出现问题,因此两个客户端的变量都存储了最后一个 INSERT 的值。

我使用了以下替代方法,但在几次测试运行中失败了,而且错误非常明显:

  • 插入
  • 锁定表
  • 选择
  • 商店
  • 解锁

谢谢!

【问题讨论】:

  • 阅读 MySQL 中的事务,这就是您需要解决的问题。请注意,如果您的 INSERT 由于某种原因失败,您还没有想到会发生什么。
  • 让我们假设事情按预期工作。当然,你的观点是正确的,但是一旦完成,我想解决这个问题。
  • 我真的看不出为什么不使用这里的交易,你需​​要的一切都符合交易的目的。您发出的查询要么必须成功(全部),要么什么也没有发生(您将违反数据完整性)。 MySQL 提供的一切都在事务期间可用(如前面建议的 last_insert_id() )。在放弃这个想法之前考虑一下,从长远来看,确保数据安全而不是损害数据可能是明智之举。
  • 哦!我正在处理 INSERT 失败。是的,正确地指出,事务是解决方案,我怎么会忘记!我可以将多个查询嵌套为事务。谢谢!
  • 嗨!只需将您的回复作为答案发布,这样我就可以接受。另一方面,是否可以在 PHP 中对 SQL 访问进行排队?

标签: php mysql concurrency queue


【解决方案1】:

我最好的猜测是您有一个自动增量列,并希望在插入一行后获取它的值。一种选择是使用LAST_INSERT_ID()(详情herehere)。

如果这不适用,请发布更多详细信息。您到底想做什么以及正在触发哪些查询?

【讨论】:

  • 主键确实是 AUTO_INCREMENT,但我要获取的是 TIMESTAMP。因此,假设 2 个客户端同时连接到服务器,第一个在 YYYY-MM-DD HH:MM:SS 插入,第二个在 YYYY-MM-DD HH:MM:SS+1 插入,导致会话变量存储 YYYY-MM -DD HH:MM:SS+1 用于两个会话。这是不对的。
  • 事务将按照您问题的 cmets 中的建议进行。或者,您可以在获得LAST_INSERT_ID() 后执行SELECT 以启用更高的并发性。
猜你喜欢
  • 2011-06-16
  • 1970-01-01
  • 2014-10-18
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多