-2

我在 mysql 数据库上有一个注册程序,它的工作原理是这样的:

INSERT INTO `tblusers` (`uname`, `upwd`, `umail`) VALUES (RU_UNAME, RU_UPWD, RU_UMAIL);
select LAST_INSERT_ID() into @newuserid;

-- then use the @newuserid to make some work on other tables.

现在我想知道它是否会得到错误的 id,特别是数据库将在其他表中插入很多,然后它可能会得到另一个表的 id,该表在插入用户和获取最后插入的 id 之间插入?

有失败的可能吗?

4

2 回答 2

1

一句话,没有。不同的数据库连接维护各自独立的LAST_INSERT_ID. 因此,其他一些插入记录的客户端tblusers不会影响您的LAST_INSERT_ID.

文档中:

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

文档值得一读。它非常详细地说明了事情。

于 2013-03-23T11:54:47.377 回答
0

MySQL 使用锁系统,它不允许 2 个进程(2 次调用脚本)修改同一行。所以表不会crash*,但是有可能MySQL无法在合理的时间内处理请求的数量,请求会等待。您应该始终尽可能快地优化您的查询。

所以,最后插入的 id 不会失败。

于 2013-03-23T11:56:20.410 回答