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

12

我已经思考了一段时间。

考虑一个规模巨大的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?

次要问题:

如果它可能失败,最好的方法是什么来防止这种可能的泄漏?

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

2个回答

19

只要PDO实现没有做出非常愚蠢的行为,它就会一直是安全的。以下内容来自MySQL关于last_insert_id的信息:

生成的ID在服务器上以每个连接为基础进行维护。这意味着对于给定客户端的大多数最近影响AUTO_INCREMENT列的语句所生成的第一个AUTO_INCREMENT值,函数返回给该客户端的值。即使其他客户端生成了自己的AUTO_INCREMENT值,此值也不会受到其影响。此行为确保每个客户端可以检索其自己的ID,而不必担心其他客户端的活动,也不需要锁定或事务。


4

lastInsertId是针对每个数据库连接的,并且不需要向服务器发送请求——mysql总是在其响应数据包中返回它。

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

除非您的查询因某种原因失败(例如无效语法),否则它永远不会给您任何其他插入ID,但在同一连接上之前的查询可能会返回上一个插入ID。 但不会给其他人的插入ID。


1
太棒了Mark,我感到很安心 :) - Mattis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接