代码之家  ›  专栏  ›  技术社区  ›  Oto Shavadze

使用事务时PDO lastInsertId()是否可靠

  •  2
  • Oto Shavadze  · 技术社区  · 10 年前

    我使用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 回复  |  直到 5 年前
        1
  •  12
  •   Jonathan Spiller    10 年前

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

    PDO的 lastInsertId (和mysql的 last_insert_id 在这种情况下,您的PDO将呼叫委托给它)在 每个连接基础 .

    从…起 mysql's documentation :

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

    并发连接不会损害返回id的完整性。正如您在评论中提到的,事务与此无关。别忘了承诺!

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