【问题标题】:Could PDO::lastInsertId() be inaccurate? [duplicate]PDO::lastInsertId() 可能不准确吗? [复制]
【发布时间】:2013-10-18 19:36:12
【问题描述】:

我有一个通过 AJAX 调用脚本的页面,该脚本可以从同一个父页面同时异步调用多次。此脚本使用 require_once 通过数据库处理程序访问配置脚本。脚本是否每次都会调用此处理程序的唯一实例,或者如果打开多个副本,当我尝试从该脚本实例获取最后插入的 ID 时,它们是否都使用相同的实例并导致不良结果?

为了清楚起见,这是我引用的命令:

$DBH->lastInsertId()

谢谢!

【问题讨论】:

  • 本网站会在您键入时为琐碎问题提供答案。请注意这些建议
  • @YourCommonSense 没有提供给我。
  • 嗯。对此感到抱歉,我确信我已经检查过了,因为我通常对此很好。

标签: php mysql pdo


【解决方案1】:

documentation

此方法可能不会在不同的 PDO 驱动程序中返回有意义或一致的结果,因为底层数据库甚至可能不支持自增字段或序列的概念。

话虽如此,我在使用lastInsertId 和MySQL 时从来没有遇到过问题。它总是有效的。

这表面上包装了对MySQL's LAST_INSERT_ID()的调用

生成的 ID 在每个连接的基础上在服务器中维护。这意味着函数返回给给定客户端的值是为影响该客户端的 AUTO_INCREMENT 列的最新语句生成的第一个 AUTO_INCREMENT 值。

即即使您面临频繁的请求,它也应该可以安全使用。

【讨论】:

  • 声望点很甜蜜,不是吗?
  • @YourCommonSense 尽管你的用户名你似乎缺乏大量的常识
  • 那么它是基于每个连接的,更相关的是,脚本的每个实例都将打开一个唯一的连接。这无疑是正确的吗? (我正在现有服务器上实现一些东西,如果出现问题,我的客户将删除彼此的内容,所以我需要非常小心。)
  • @JS 是的;例如,每次您拨打new PDO 时。我确切地知道您要实现什么,并且我之前在这些情况下使用过lastInsertId,没有任何问题。如果你喜欢,你可以很容易地测试它。将您的 ajax 脚本更新为 sleep 一段时间,然后快速点击两次。您应该确认您获得了正确的 ID
  • 我相信你,因为你看起来很有知识。我当然可以测试它,但如果我要依赖测试,我希望它比这更广泛,尽管在这里使用相当敏感/关键的基础设施,但我也正处于一个重要的时间紧缩状态.感谢您的帮助!
【解决方案2】:

$DBH->lastInsertId() 在 MySQL 的情况下检索last_insert_id() 函数的结果。

last_insert_id() 是基于会话的,这意味着如果您有 2 个 PHP 脚本正在运行,您将只能获得每个脚本生成的 last_insert_id

生成的 ID 保存在服务器上的 每个连接的基础。这意味着返回的值 给定客户端的函数是生成的第一个 AUTO_INCREMENT 值 对于影响 AUTO_INCREMENT 列的最新语句 客户。此值不会受到其他客户端的影响,即使它们 生成自己的 AUTO_INCREMENT 值。这种行为确保 每个客户端都可以检索自己的 ID 而无需担心 其他客户端的活动,并且不需要锁或 交易。

MySQL and PDO: Could PDO::lastInsertId theoretically fail?

【讨论】:

  • 所以这是肯定的。
【解决方案3】:

documentation中所述:

注意:此方法可能不会返回有意义或一致的结果 跨不同的 PDO 驱动程序,因为底层数据库可能不会 甚至支持自增字段或序列的概念。

【讨论】:

  • 我看不出这与我的问题有什么直接关系。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-19
  • 2011-08-21
  • 2020-01-01
  • 1970-01-01
  • 2021-12-27
  • 2011-02-10
  • 2010-09-22
相关资源
最近更新 更多