lastInsertId可能的问题

时间:2015-10-30 13:50:26

标签: php mysql

我正在开发一个PHP / MySQL中的小型Web应用程序作为课程项目。

当用户创建帐户(帐户类型必须是Tutor或Student)时,我按照以下逻辑将他插入数据库:
注意:我通过将USER设为超类来实现表之间的继承,STUDENT和TUTOR都将FK设置为​​user_id

INSERT INTO USER; // Line A

// The following are Lines B
if (type == 'TUTOR')
     INSERT INTO TUTOR (user_id) VALUES (lastInsertId());
else INSERT INTO STUDENT (user_id) VALUES (lastInsertId());

在一个大型应用程序中是否有可能同时有100个客户端注册该逻辑无法正确执行其任务?

例如,用户1(学生)正在注册,现在首先插入USER,ID = 1 在他插入STUDENT之前,另一个用户User-2(Tutor)来了并且也在注册该应用程序,并且他被插入USER并且id = 2

现在,User-1的执行继续,lastInsertId()现在是2而不是1 ...

这可能发生在大型网络应用中,还是假设A线和B线之间有大量代码?

请注意,我没有使用单例模式连接到数据库。

2 个答案:

答案 0 :(得分:2)

最后一个插入ID是特定于数据库连接 保证 返回当前连接发出的最后一个语句的插入ID。它与其他并发查询明确隔离。

答案 1 :(得分:1)

您的代码非常安全。 MySQL函数LAST_INSERT_ID()为不同的连接返回的值之间没有混合。正如文档所述:

  

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

我猜你发布的伪代码是指PHP函数PDO::lastInsertId(),它用于MySQL包装MySQL函数LAST_INSERT_ID()