我正在PHP/MySQL中开发一个小型web应用程序,作为一个课程项目。
当用户创建一个帐户(帐户类型必须是教师或学生)时,我按照以下逻辑将他插入数据库:
注意:我通过让用户成为超类实现了表之间的继承,学生和导师都有FKs到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(学生)正在注册,现在先用id=1插入到id=1中
在他被插入到STUDENT之前,另一个用户用户-2 (Tutor)也来了,并且正在注册这个应用程序,他被插入到USER和id=2中。
现在,用户-1的执行继续进行,lastInsertId()现在是2而不是1.
这种情况是发生在大型网络应用程序中,还是假设在A行和B行之间有大量代码块?
请注意,我没有使用单例模式连接到数据库。
发布于 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()。
发布于 2015-10-30 13:53:43
最后一个insert id是特定于数据库连接的。保证返回当前连接发出的最后一个语句的插入id。它显式地与其他并发查询隔离。
https://stackoverflow.com/questions/33437619
复制相似问题