2

我使用 PDO 事务

try {
    DB::$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    DB::$db->beginTransaction();

    $db->prepare( insert query );
    $db->execute();

    $last_insert_id = $db->lastInsertId();

    ...
    ...

此脚本需要多个并发请求。

问题:是否有可能lastInsertId()为实际插入行的用户返回不正确的值?

(“不正确的值”是指:由其他用户插入的 id)。

4

1 回答 1

11

你安全了。您获得的 ID 将是正确的。

PDO (以及在这种情况下您的 PDO 将调用委托给的lastInsertIdmysql )在每个连接的基础上给出最后一个自动生成的 ID 。last_insert_id

来自mysql的文档

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

并发连接不会损害返回 id 的完整性。正如您在评论中提到的那样,交易与此无关。只是不要忘记承诺!

我还要提到不太可能,如果您在同一连接上运行多个语句,并且如果您的执行方法抛出未正确处理的异常,则 lastInsertId 可能会返回该连接上最后一次成功插入的 id。但它永远不能从另一个用户的查询中返回一个 ID。

于 2014-03-03T12:36:39.433 回答