【问题标题】:MySQL and PDO: Could PDO::lastInsertId theoretically fail?MySQL 和 PDO:理论上 PDO::lastInsertId 会失败吗?
【发布时间】:2011-08-21 07:55:49
【问题描述】:

我一直在思考这个问题。

考虑一个庞大的网络应用程序,比方说,每秒执行数百万个 SQL 查询。

我运行我的代码:

$q = $db->prepare('INSERT INTO Table
                 (First,Second,Third,Fourth)
          VALUES (?,?,?,?)');
$q->execute(array($first,$second,$third,$fourth));

紧接着,我想获取最后一个查询的自动递增 ID:

$id = $db->lastInsertId();

lastInsertId 是否有可能失败,即获取在我的两个代码块之间执行的某些 SQL 插入查询的 ID?

中学:

如果它可能失败,那么堵住这种可能的泄漏的最佳方法是什么?

创建另一个 SQL 查询以从数据库中获取正确的 ID 会更安全吗?

【问题讨论】:

    标签: mysql database pdo


    【解决方案1】:

    只要 PDO 实现没有做一些真正愚蠢的事情,它总是安全的。以下来自last_insert_id上的MySQL信息:

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

    【讨论】:

      【解决方案2】:

      没有。 lastInsertId 是每个连接的,不需要向服务器发出请求 - mysql 总是在其响应数据包中将其发送回。

      所以如果execute方法没有抛出异常,那么就保证你在lastInsertId中有正确的值。

      它永远不会为您提供其他任何内容的插入 ID,除非您的查询由于某种原因(例如无效语法)失败,在这种情况下,它可能会为您提供同一连接上前一个查询的插入 ID。但不是其他人的。

      【讨论】:

      • 真棒马克,那我就放心了:)
      猜你喜欢
      • 2012-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-01
      • 1970-01-01
      • 2021-12-27
      • 2011-02-10
      • 2010-09-22
      相关资源
      最近更新 更多