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

问题描述 投票:2回答:1

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

php mysql pdo transactions last-insert-id
1个回答
9
投票

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

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

来自mysql's documentation

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.