首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >lastInsertId可能出现的问题

lastInsertId可能出现的问题
EN

Stack Overflow用户
提问于 2015-10-30 13:50:26
回答 2查看 40关注 0票数 0

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

当用户创建一个帐户(帐户类型必须是教师或学生)时,我按照以下逻辑将他插入数据库:

注意:我通过让用户成为超类实现了表之间的继承,学生和导师都有FKs到user_id。

INSERT INTO USER; // Line A

代码语言:javascript
复制
// 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(学生)正在注册,现在先用id=1插入到id=1中

在他被插入到STUDENT之前,另一个用户用户-2 (Tutor)也来了,并且正在注册这个应用程序,他被插入到USER和id=2中。

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

这种情况是发生在大型网络应用程序中,还是假设在A行和B行之间有大量代码块?

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-10-30 13:59:38

你的密码非常安全。对于不同的连接,MySQL函数LAST_INSERT_ID()返回的值之间没有混合。如文件所述:

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

我猜您发布的伪代码是指PHP函数PDO::lastInsertId(),对于MySQL,它封装了MySQL函数LAST_INSERT_ID()

票数 1
EN

Stack Overflow用户

发布于 2015-10-30 13:53:43

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33437619

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档