我一直在思考这个问题。
考虑一个巨大比例的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查询会更安全吗?
答案 0 :(得分:18)
如果PDO实施没有做一些真正的蠢事,那将永远是安全的。以下内容来自last_insert_id
上的MySQL信息:
生成的ID基于每个连接在服务器中维护。这意味着函数返回给定客户端的值是为该客户端影响AUTO_INCREMENT列的最新语句生成的第一个AUTO_INCREMENT值。此值不受其他客户端的影响,即使它们生成自己的AUTO_INCREMENT值。此行为可确保每个客户端都可以检索自己的ID,而无需关心其他客户端的活动,也无需锁定或事务。
答案 1 :(得分:4)
没有。 lastInsertId是每个连接,并且不需要对服务器的请求 - mysql总是在它的响应包中发回它。
因此,如果execute方法没有抛出异常,那么保证在lastInsertId中具有正确的值。
除非您的查询因某种原因(例如语法无效)失败,否则它不会为您提供任何其他内容的插入ID,在这种情况下,它可能会在同一连接上为您提供前一个插入ID。但不是别人的。