使用事务时可靠或不可靠的PDO lastInsertId()

时间:2014-03-02 11:14:05

标签: php mysql pdo transactions last-insert-id

我使用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)。

1 个答案:

答案 0 :(得分:9)

你很安全。你得到的ID是正确的。

PDO的lastInsertId(以及您的PDO在此情况下委托调用的last_insert_id)以每个连接为基础提供最后一个自动生成的ID。

来自mysql's documentation

  

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

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

我还要提一下,如果你在同一个连接上运行多个语句,并且如果你的execute方法抛出了一个未正确处理的异常,那么lastInsertId可能会返回上一个成功插入的id,这种可能性很小。连接。但它永远不能从其他用户的查询中返回ID。