我使用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)。
你安全了。你得到的ID是正确的。
PDO的lastInsertId
(以及您的PDO在此情况下委托调用的mysql的last_insert_id
)在每个连接的基础上提供最后一个自动生成的ID。
生成的ID在每个连接的基础上在服务器中维护。这意味着函数返回给定客户端的值是为该客户端影响AUTO_INCREMENT列的最新语句生成的第一个AUTO_INCREMENT值。此值不受其他客户端的影响,即使它们生成自己的AUTO_INCREMENT值。此行为可确保每个客户端都可以检索自己的ID,而无需关心其他客户端的活动,也无需锁定或事务。
并发连接不会损害返回的id的完整性。正如您在评论中提到的,交易与此无关。只是不要忘记提交!
我还要提一下,如果你在同一个连接上运行多个语句,并且如果你的execute方法抛出一个未正确处理的异常,那么lastInsertId可以返回该连接上最后一次成功插入的id。但它永远不会从其他用户的查询返回ID。