MySQL和PDO:PDO :: lastInsertId理论上会失败吗?

时间:2011-05-08 23:45:15

标签: mysql database pdo

我一直在思考这个问题。

考虑一个巨大比例的Web应用程序,比方说,每秒执行数百万个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?

次要的:

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

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

2 个答案:

答案 0 :(得分:18)

如果PDO实施没有做一些真正的蠢事,那将永远是安全的。以下内容来自last_insert_id上的MySQL信息:

  

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

答案 1 :(得分:4)

没有。 lastInsertId是每个连接,并且不需要对服务器的请求 - mysql总是在它的响应包中发回它。

因此,如果execute方法没有抛出异常,那么保证在lastInsertId中具有正确的值。

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